✅PmHub整合TransmittableThreadLocal (TTL)缓存用户数据(👍必看)
你好,欢迎来到面试系列!这篇文章主要教你如何将 PmHub 中使用到的 TTL 写进简历,其中会先进行 ThreadLocal 等基础知识的讲解,再到实战项目的代码解析,最后我们设计了模拟面试针对于该问题,做了面试连环问。
你可以直接将以下技术点写在简历上,这部分知识比较多,可以慢慢消化哦。
- 基于 TransmittableThreadLocal (TTL) 自定义请求头拦截器,将Header 数据封装到线程变量中方便获取,减少用户信息数据库查询次数,同时验证当前用户有效期自动刷新有效期。
理论知识
TransmittableThreadLocal (TTL)是增强版的 ThreadLocal,所以要想搞清楚 TTL,先需要温习一下 ThreadLocal 的基础知识。
ThreadLocal 简介
ThreadLocal 是什么?
ThreadLocal 是Java中 lang 包下的一个类,是用来解决多线程下共享变量并发问题的,所谓共享变量即同一个变量在不同线程下赋予不同值。
ThreadLocal 会在多线程环境中为每个线程维护独立的变量副本,让每个线程都拥有自己的数据副本,避免了多个线程同时访问同一个变量的冲突问题。

ThreadLocal和 synchronized 区别?
synchronized 是基于锁机制的,用于控制对共享资源的访问,确保线程间数据的一致性和安全性,实现线程间的互斥访问。
为了你更好的理解 synchronized 锁,我特意找了一个原理图:

所以说, synchronized是时间换空间让多个线程排队访问,ThreadLocal是空间换时间为每个线程提供了一份变量的副本,从而实现线程隔离。(可以直接和面试官这样说👊)
ThreadLocal 使用场景
ThreadLocal 主要用于实现线程间的数据隔离,其使用场景比较多,下面列举几个比较常见的场景:
1、用户会话信息
在 web 应用中,每个请求通常会在独立的线程中处理。可以使用 ThreadLocal 存储每个用户的会话信息,避免不同请求线程之间的数据混淆。
public class UserContext {
private static ThreadLocal userHolder = ThreadLocal.withInitial(() -> null);
public static void setUser(String user) {
userHolder.set(user);
}
public static String getUser() {
return userHolder.get();
}
public static void clear() {
userHolder.remove();
}
}
// 在某个请求处理线程中使用
UserContext.setUser("UserA");
String currentUser = UserContext.getUser();
System.out.println("Current User: " + currentUser);
UserContext.clear();
2、数据库连接管理
在线程中保存数据库连接,使得每个线程都有自己的数据库连接实例,避免了连接共享问题,提高了性能。
public class ConnectionManager {
private static ThreadLocal connectionHolder = ThreadLocal.withInitial(() -> {
try {
return DriverManager.getConnection("jdbc:your_database_url");
} catch (SQLException e) {
throw new RuntimeException(e);
}
});
public static Connection getConnection() {
return connectionHolder.get();
}
public static void closeConnection() throws SQLException {
connectionHolder.get().close();
connectionHolder.remove();
}
}
// 在某个线程中使用
Connection connection = ConnectionManager.getConnection();
// 执行数据库操作
ConnectionManager.closeConnection();
3、格式化工具
如 SimpleDateFormat 是线程不安全的,可以使用 ThreadLocal 为每个线程提供一个独立的 SimpleDateFormat 实例,避免线程安全问题。
public class DateFormatter {
private static ThreadLocal dateFormatHolder = ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd"));
public static String format(Date date) {
return dateFormatHolder.get().format(date);
}
}
// 在某个线程中使用
String formattedDate = DateFormatter.format(new Date());
System.out.println("Formatted Date: " + formattedDate);
4、日志上下文信息传递
在日志记录中,可以使用 ThreadLocal 存储一些上下文信息(如请求 ID、用户 ID 等),以便在不同的日志记录中共享这些上下文信息。
public class LogContext {
private static ThreadLocal requestIdHolder = ThreadLocal.withInitial(() -> null);
public static void setRequestId(String requestId) {
requestIdHolder.set(requestId);
}
public static String getRequestId() {
return requestIdHolder.get();
}
public static void clear() {
requestIdHolder.remove();
}
}
// 在某个请求处理线程中使用
LogContext.setRequestId("123456");
String requestId = LogContext.g... 未能定位到原文的划线
企业级Agent工作流编排项目PaiFlow
Vibe Coding版本的PaiAgent
派聪明RAG AI知识库Java版本+Go版本
微服务 PmHub、技术派、MYDB
求职派JobClaw(OpenClaw/Hermes架构
PaiCLI(类似Claude Code的Agent
派简历(代码已完成)
等实战项目。
1. 微信扫右侧的优惠券加入知识星球
2. 解锁星球的实战项目教程和源码: 项目源码+教程获取
真诚点赞 诚不我欺
回复