当前位置: 首页 > news >正文

ThreadLocal 的使用场景

在现代电商平台中,ThreadLocal 常用于以下场景,特别是与线程隔离相关的业务中,以提高性能和简化上下文传递。

1. 用户上下文信息管理
场景:在用户发起的每次请求中,需要携带用户 ID、角色、权限等信息,而这些信息需要在整个请求线程中传递。
应用:
将用户上下文信息(如 userId、sessionId 等)存储到 ThreadLocal 中,便于在业务处理的不同阶段获取,而无需显式传递。
如在用户权限校验、订单处理、日志记录中频繁使用。

public class UserContext {private static ThreadLocal<String> userId = new ThreadLocal<>();public static void setUserId(String id) {userId.set(id);}public static String getUserId() {return userId.get();}public static void clear() {userId.remove();}
}

2. 分布式链路追踪
场景:电商平台中调用链复杂,每个请求需要唯一的 TraceID 来追踪整个分布式系统的调用链。
应用:
将 TraceID 存储在 ThreadLocal 中,方便在每个服务组件中传递和使用。
例如,在日志框架中打印 TraceID,帮助快速定位问题。

public class TraceContext {private static ThreadLocal<String> traceId = new ThreadLocal<>();public static void setTraceId(String id) {traceId.set(id);}public static String getTraceId() {return traceId.get();}public static void clear() {traceId.remove();}
}

3. 数据库连接管理
场景:在电商业务中,某些操作需要特定的数据库隔离级别,或者需要在一个线程内保持同一个数据库连接。
应用:
利用 ThreadLocal 缓存数据库连接,避免频繁获取连接。
适用于手动管理事务时,在一个线程内保证同一连接被复用。

public class ConnectionManager {private static ThreadLocal<Connection> connectionThreadLocal = new ThreadLocal<>();public static Connection getConnection() {Connection conn = connectionThreadLocal.get();if (conn == null) {conn = createNewConnection(); // 创建新连接connectionThreadLocal.set(conn);}return conn;}public static void closeConnection() {Connection conn = connectionThreadLocal.get();if (conn != null) {conn.close();connectionThreadLocal.remove();}}
}

4. 防重复提交
场景:电商平台中,防止用户重复提交订单或操作(例如秒杀、抢购)。
应用:
使用 ThreadLocal 存储请求的唯一标识符(如 RequestId 或 Token),以便在一次线程执行中识别请求是否已处理。

public class RequestContext {private static ThreadLocal<String> requestId = new ThreadLocal<>();public static void setRequestId(String id) {requestId.set(id);}public static String getRequestId() {return requestId.get();}public static void clear() {requestId.remove();}
}

5. 多数据源动态切换
场景:在订单查询、数据报表等场景下,不同业务模块可能需要访问不同的数据源。
应用:
利用 ThreadLocal 存储当前线程需要使用的数据源标识符,在数据源路由时动态切换。

public class DataSourceContext {private static ThreadLocal<String> dataSourceKey = new ThreadLocal<>();public static void setDataSourceKey(String key) {dataSourceKey.set(key);}public static String getDataSourceKey() {return dataSourceKey.get();}public static void clear() {dataSourceKey.remove();}
}

6. 日志输出优化
场景:需要在同一个线程的所有日志中打印统一的信息(如用户 ID、请求 ID 等)。
应用:
将公共信息(如用户 ID、TraceID 等)存入 ThreadLocal,由日志框架在打印日志时自动获取。

public class LogContext {private static ThreadLocal<String> logInfo = new ThreadLocal<>();public static void setLogInfo(String info) {logInfo.set(info);}public static String getLogInfo() {return logInfo.get();}public static void clear() {logInfo.remove();}
}

注意事项
避免内存泄漏:
使用完 ThreadLocal 后,调用 remove() 方法清理,防止线程池复用导致数据残留。
适用场景:
ThreadLocal 适合线程独立、无需跨线程共享的数据。
不可滥用:
如果不需要线程隔离,不建议使用 ThreadLocal,以免引入不必要的复杂性。

通过这些场景,ThreadLocal 在电商平台中可以有效提高业务开发的灵活性,同时保证线程隔离的数据安全性。

相关文章:

ThreadLocal 的使用场景

在现代电商平台中&#xff0c;ThreadLocal 常用于以下场景&#xff0c;特别是与线程隔离相关的业务中&#xff0c;以提高性能和简化上下文传递。 1. 用户上下文信息管理 场景&#xff1a;在用户发起的每次请求中&#xff0c;需要携带用户 ID、角色、权限等信息&#xff0c;而这…...

后端开发 Springboot整合Redis Spring Data Redis 模板

目录 redis 配置 RedisConfig 类 完整代码 代码讲解 1. 类定义和注解 2. 定义 RedisTemplate Bean 3. 配置 JSON 序列化 4. 配置 Redis 的 key 和 value 序列化方式 5. 完成配置并返回 RedisTemplate 总结 redis 服务接口实现类 类级别 注入 RedisTemplate 常用 Re…...

代码随想录算法训练营第 4 天(链表 2)| 24. 两两交换链表中的节点19.删除链表的倒数第N个节点 -

一、24. 两两交换链表中的节点 题目&#xff1a;24. 两两交换链表中的节点 - 力扣&#xff08;LeetCode&#xff09; 视频&#xff1a;帮你把链表细节学清楚&#xff01; | LeetCode&#xff1a;24. 两两交换链表中的节点_哔哩哔哩_bilibili 讲解&#xff1a;代码随想录 dummy-…...

【RDMA学习笔记】1:RDMA(Remote Direct Memory Access)介绍

从帝国理工的PPT学习。 什么是RDMA Remote Direct Memory Access&#xff0c;也就是Remote的DMA&#xff0c;是一种硬件机制&#xff0c;能直接访问远端结点的内存&#xff0c;而不需要处理器介入。 其中&#xff1a; Remote&#xff1a;跨node进行数据传输Direct&#xff…...

网络安全常见的35个安全框架及模型

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 01、概述 网络安全专业机构制定的一套标准、准则和程序&#xff0c;旨在帮助组织了解和管理面临的网络安全风险。优秀的安全框架及模型应该为用户提供一种可靠方法&#xff0c;帮助其实现网络安全建设…...

Elasticsearch介绍及使用

Elasticsearch 是一款基于 Lucene 库构建的开源、分布式、RESTful 风格的搜索引擎和分析引擎&#xff0c;具有强大的全文搜索、数据分析、机器学习等功能&#xff0c;广泛应用于日志分析、实时数据分析、全文检索等场景。 核心概念 索引&#xff08;Index&#xff09;&#xf…...

Leetocde516. 最长回文子序列 动态规划

原题链接&#xff1a;Leetocde516. 最长回文子序列 class Solution { public:int longestPalindromeSubseq(string s) {int n s.size();vector<vector<int>> dp(n, vector<int>(n, 1));for (int i 0; i < n; i) {dp[i][i] 1;if (i 1 < n &&…...

iOS 逆向学习 - Inter-Process Communication:进程间通信

iOS 逆向学习 - Inter-Process Communication&#xff1a;进程间通信 一、进程间通信概要二、iOS 进程间通信机制详解1. URL Schemes2. Pasteboard3. App Groups 和 Shared Containers4. XPC Services 三、不同进程间通信机制的差异四、总结 一、进程间通信概要 进程间通信&am…...

高级生化大纲

一&#xff0c;蛋白质化学&#xff1a; 蛋白质分离是生物化学和分子生物学研究中的一项基本技术&#xff0c;用于根据蛋白质的物理和化学特性将其从混合物中分离出来。 1. 离心分离法 离心分离法利用离心力来分离不同质量或密度的颗粒和分子。 差速离心&#xff1a;通过逐…...

YARN WebUI 服务

一、WebUI 使用 与HDFS一样&#xff0c;YARN也提供了一个WebUI服务&#xff0c;可以使用YARN Web用户界面监视群集、队列、应用程序、服务、流活动和节点信息。还可以查看集群详细配置的信息&#xff0c;检查各种应用程序和服务的日志。 1.1 首页 浏览器输入http://node2.itc…...

【Unity3D】利用IJob、Burst优化处理切割物体

参考文章&#xff1a; 【Unity】切割网格 【Unity3D】ECS入门学习&#xff08;一&#xff09;导入及基础学习_unity ecs教程-CSDN博客 【Unity3D】ECS入门学习&#xff08;十二&#xff09;IJob、IJobFor、IJobParallelFor_unity ijobparallelfor-CSDN博客 工程资源地址&…...

【大前端】Vue3 工程化项目使用详解

目录 一、前言 二、前置准备 2.1 环境准备 2.1.1 create-vue功能 2.1.2 nodejs环境 2.1.3 配置nodejs的环境变量 2.1.4 更换安装包的源 三、工程化项目创建与启动过程 3.1 创建工程化项目 3.2 项目初始化 3.3 项目启动 3.4 核心文件说明 四、VUE两种不同的API风格 …...

基于文件系统分布式锁原理

分布式锁&#xff1a;在一个公共的存储服务上打上一个标记&#xff0c;如Redis的setnx命令&#xff0c;是先到先得方式获得锁&#xff0c;ZooKeeper有点像下面的demo,比较大小的方式判决谁获得锁。 package com.ldj.mybatisflex.demo;import java.util.*; import java.util.co…...

简历整理YH

一&#xff0c;订单中心 1&#xff0c;调拨单 融通(Rocketmq)-订单中心&#xff1a;ECC_BMS123(已出单)&#xff0c;125(分配),127(发货),129(收货) 通过RocketMq接入多场景订单数据 2&#xff0c;销售单 sap&#xff08;FTP&#xff09;-订单中心&#xff0c;下发1002,1003,…...

Kotlin 协程基础三 —— 结构化并发(二)

Kotlin 协程基础系列&#xff1a; Kotlin 协程基础一 —— 总体知识概述 Kotlin 协程基础二 —— 结构化并发&#xff08;一&#xff09; Kotlin 协程基础三 —— 结构化并发&#xff08;二&#xff09; Kotlin 协程基础四 —— CoroutineScope 与 CoroutineContext Kotlin 协程…...

微信小程序实现长按录音,点击播放等功能,CSS实现语音录制动画效果

有一个需求需要在微信小程序上实现一个长按时进行语音录制&#xff0c;录制时间最大为60秒&#xff0c;录制完成后&#xff0c;可点击播放&#xff0c;播放时再次点击停止播放&#xff0c;可以反复录制&#xff0c;新录制的语音把之前的语音覆盖掉&#xff0c;也可以主动长按删…...

校园跑腿小程序---轮播图,导航栏开发

hello hello~ &#xff0c;这里是 code袁~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f981;作者简介&#xff1a;一名喜欢分享和记录学习的在校大学生…...

详细全面讲解C++中重载、隐藏、覆盖的区别

文章目录 总结1、重载示例代码特点1. 模板函数和非模板函数重载2. 重载示例与调用规则示例代码调用规则解释3. 特殊情况与注意事项二义性问题 函数特化与重载的交互 2. 函数隐藏&#xff08;Function Hiding&#xff09;概念示例代码特点 3. 函数覆盖&#xff08;重写&#xff…...

一文读懂单片机的串口

目录 串口通信的基本概念 串口通信的关键参数 单片机串口的硬件连接 单片机串口的工作原理 数据发送过程 数据接收过程 单片机串口的编程实现 以51单片机为例 硬件连接 初始化串口 发送数据 接收数据 串口中断服务函数 代码示例 单片机串口的应用实例 单片机与…...

HTML5 网站模板

HTML5 网站模板 参考 HTML5 Website Templates...

3DGS内存优化新思路:拆解Scaffold-GS与Normal-GS中的锚点与共享IDIV设计

3DGS内存优化新思路&#xff1a;拆解Scaffold-GS与Normal-GS中的锚点与共享IDIV设计 在实时3D渲染领域&#xff0c;3D Gaussian Splatting&#xff08;3DGS&#xff09;技术正面临内存效率的严峻挑战。当我们将3DGS模型部署到移动设备或边缘计算节点时&#xff0c;显存限制往往…...

教育轻创合伙人模式成为教育行业新风口的原因与市场空间解析

随着教育行业数字化转型的加速&#xff0c;传统教育模式面临成本高、扩张慢等挑战。在此背景下&#xff0c;教育轻创合伙人模式应运而生&#xff0c;正迅速成为教育行业的新风口。这一模式通过低门槛、高灵活性的合作方式&#xff0c;有效打开了教育市场的增量空间。本文将深入…...

Agent 不是玄学!前端只需要会做步骤可视化就够了

“AI 智能体”“思考链”“工具调用”—— 这些词听着就像 “AI 要统治世界”&#xff0c;是不是觉得离前端特别远&#xff1f;其实不然&#xff01;对前端来说&#xff0c;Agent 就是 “一个会自己做任务的 AI”—— 比如 “让 AI 自动查天气、写周报、发邮件”&#xff0c;你…...

MouseOverShapeBox

MouseOverShapeBox MouseOverShapeBox 源码详解 - 鼠标悬停高亮标注框 这是一个增强版图像标注控件&#xff0c;当鼠标移动到形状上时&#xff0c;会高亮显示该形状。类似于图片标注工具中鼠标悬停时边框变色的效果。&#x1f4c4; 文件头部&#xff08;版权信息&#xff09; /…...

为什么传统PDF翻译总是破坏格式?BabelDOC如何5分钟实现专业文档精准翻译

为什么传统PDF翻译总是破坏格式&#xff1f;BabelDOC如何5分钟实现专业文档精准翻译 【免费下载链接】BabelDOC Yet Another Document Translator 项目地址: https://gitcode.com/GitHub_Trending/ba/BabelDOC 你是否曾经尝试翻译一份学术论文或技术文档&#xff0c;却发…...

告别printf调试:手把手教你用STM32F411的USART6重定向标准输入输出

STM32F411串口调试革命&#xff1a;USART6重定向实战指南 在嵌入式开发中&#xff0c;调试信息的输出是开发者最依赖的工具之一。传统调试方式往往需要复杂的硬件调试器或频繁烧录程序&#xff0c;效率低下且不够灵活。本文将带你探索一种高效、便捷的调试方案——通过STM32F4…...

文墨共鸣大模型在网络安全领域的应用:模拟攻击脚本分析与安全报告撰写

文墨共鸣大模型在网络安全领域的应用&#xff1a;模拟攻击脚本分析与安全报告撰写 最近和几个做安全的朋友聊天&#xff0c;他们都在抱怨同一个问题&#xff1a;每天面对海量的告警日志和五花八门的攻击脚本&#xff0c;分析起来耗时费力&#xff0c;写报告更是头疼。技术细节…...

LSM303DLHC驱动开发:磁力计校准与六轴姿态解算

1. LSM303DLHC 姿态感知核心&#xff1a;高精度磁力计与加速度计集成库深度解析LSM303DLHC 是意法半导体&#xff08;STMicroelectronics&#xff09;推出的紧凑型六轴惯性测量单元&#xff08;IMU&#xff09;&#xff0c;集成了三轴加速度计&#xff08;2g/4g/8g 可选量程&am…...

WebGLStudio.js实时反射技术终极指南:环境映射与反射探针完全解析

WebGLStudio.js实时反射技术终极指南&#xff1a;环境映射与反射探针完全解析 【免费下载链接】webglstudio.js A full open source 3D graphics editor in the browser, with scene editor, coding pad, graph editor, virtual file system, and many features more. 项目地…...

OpenClaw+Phi-3-mini-128k-instruct:自动化代码审查系统

OpenClawPhi-3-mini-128k-instruct&#xff1a;自动化代码审查系统 1. 为什么需要个人级代码审查助手 作为独立开发者&#xff0c;我经常陷入这样的困境&#xff1a;在GitHub上提交PR后&#xff0c;要么苦等同事review&#xff0c;要么自己反复检查代码质量。传统CI工具只能做…...