news 2026/2/10 19:05:16

Jedis线程不安全问题

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Jedis线程不安全问题

1. 为什么 Jedis 是线程不安全的?

Jedis 实例在多线程环境下是线程不安全的。其根本原因在于 Jedis 的底层实现:

  • 共享 Socket 连接:Jedis 内部维护了一个唯一的Socket连接和对应的输入/输出流(InputStream/OutputStream)。
  • 请求-响应模式冲突:Jedis 发送请求和接收响应是串行的。如果多个线程共享同一个 Jedis 实例,线程 A 发送了GET key1,在读取响应前,线程 B 发送了SET key2 val2。此时线程 A 读取到的响应可能是线程 B 操作的结果,从而导致数据错乱协议解析异常Socket 连接关闭

2. 解决方案:JedisPool (线程池)

为了解决线程安全问题并提高性能,官方推荐使用JedisPool

  • 原理:预先创建一组 Jedis 实例并存入池中。每个线程需要操作 Redis 时,从池中“借出”一个专用的实例,操作完成后再“归还”。
  • 效果:确保在同一时刻,一个 Jedis 实例只被一个线程独占,从物理上隔离了线程竞争。

3. 代码示例

A. 依赖配置 (Maven)

pom.xml中引入 Jedis 和连接池依赖(适配 Spring Boot 3.4.2 开发环境):

<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>5.2.0</version></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId><version>2.12.0</version></dependency>

B. JedisPool 初始化配置

配置线程池的核心参数,以保证高并发下的稳定性:

publicclassJedisPoolFactory{privatestaticfinalJedisPooljedisPool;static{// 1. 配置连接池参数JedisPoolConfigconfig=newJedisPoolConfig();config.setMaxTotal(20);// 最大连接数config.setMaxIdle(10);// 最大空闲连接config.setMinIdle(2);// 最小空闲连接config.setMaxWait(Duration.ofMillis(2000));// 获取连接最大等待时间// 2. 初始化 JedisPooljedisPool=newJedisPool(config,"127.0.0.1",6379,1000,"your_password");}publicstaticJedisgetJedis(){returnjedisPool.getResource();}}

C. 正确的使用模式 (Try-with-resources)

使用try-with-resources语法可以确保 Jedis 实例在使用完毕后自动触发close()方法归还给线程池,而不是关闭 Socket:

publicvoidredisOperation(){// 从池中借出连接try(Jedisjedis=JedisPoolFactory.getJedis()){// 执行 Redis 命令jedis.set("user:name","czl");// 示例使用Stringvalue=jedis.get("user:name");System.out.println("Result: "+value);}catch(Exceptione){// 异常处理逻辑e.printStackTrace();}// 退出 try 块后,jedis 实例自动归还到线程池}

4. 在 SpringBoot 中集成 Jedis 线程池

在 Spring Boot 项目中,我们不再需要手动通过JedisPool编写工厂类,而是利用Spring Data Redis提供的自动化配置。

4.1 核心依赖配置

首先,在pom.xml中引入spring-boot-starter-data-redis。 注意必须显式排除默认的 Lettuce 客户端(Spring Boot 默认使用 Lettuce),并引入 Jedis 驱动:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId><exclusions><exclusion><groupId>io.lettuce</groupId><artifactId>lettuce-core</artifactId></exclusion></exclusions></dependency><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId></dependency>

4.2 YAML 线程池参数配置

application.yaml中,我们需要指定客户端类型为jedis,并配置具体的连接池参数以确保多线程安全。

spring:data:redis:host:127.0.0.1port:6379client-type:jedis# 指定使用 Jedis 客户端jedis:pool:max-active:20# 连接池最大连接数(对应 maxTotal)max-idle:10# 最大空闲连接min-idle:2# 最小空闲连接max-wait:2000ms# 获取连接的最大等待时间

5. 代码实现示例

5.1 自定义序列化配置

为了配合你之前使用的JsonUtils,建议配置一个自定义的RedisTemplate。 Spring 会自动将上述 YAML 中的连接池参数注入到RedisConnectionFactory中。

@ConfigurationpublicclassRedisConfig{@BeanpublicRedisTemplate<String,Object>redisTemplate(RedisConnectionFactoryfactory){RedisTemplate<String,Object>template=newRedisTemplate<>();template.setConnectionFactory(factory);// 使用 String 序列化 Keytemplate.setKeySerializer(newStringRedisSerializer());// 使用 JSON 序列化 Valuetemplate.setValueSerializer(newGenericJackson2JsonRedisSerializer());returntemplate;}}

5.2 业务调用示例

在业务层,直接注入RedisTemplate。 Spring Data Redis 会自动从池中借还连接,你无需再关心close()JedisPool的手动操作:

@ServicepublicclassUserService{@AutowiredprivateRedisTemplate<String,Object>redisTemplate;publicvoidsaveUser(UserDOuser){// 底层自动从 JedisPool 借出连接,执行完自动归还redisTemplate.opsForValue().set("user:"+user.getId(),user);}}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/10 17:54:30

大模型必收藏:文本表示全解析(从分词到词向量技术详解)

本文系统介绍了NLP中的文本表示技术&#xff0c;包括分词方法&#xff08;词级、字符级、子词级&#xff09;和词表示技术&#xff08;One-hot编码、Word2Vec、上下文相关词表示&#xff09;。详细阐述了英文和中文分词策略&#xff0c;以及如何使用Word2Vec生成语义化词向量&a…

作者头像 李华
网站建设 2026/2/10 13:32:46

SAP拒绝调整续约折扣政策应对云业务增速放缓

尽管云业务预期低于预期并导致其五年来最大的股价跌幅&#xff0c;SAP仍拒绝改变其续约折扣策略。在企业软件供应商市值动荡的一周内&#xff0c;这家欧洲ERP巨头在1月29日预测其云业务积压订单增长将出现轻微下降后&#xff0c;市值暴跌22%。该公司公布的2025日历年度营收为36…

作者头像 李华
网站建设 2026/2/9 19:53:10

科研数据AI分析工具,AI应用架构师的数据分析新手段

科研数据AI分析工具:AI应用架构师的数据分析新手段 关键词:科研数据AI分析、AI应用架构师、数据分析工具、机器学习模型、数据预处理、可视化工具、架构设计、多模态数据融合 摘要:在大数据与人工智能飞速发展的今天,科研领域正经历着从传统分析向智能分析的深刻变革。科研…

作者头像 李华
网站建设 2026/2/10 16:13:50

【游戏推荐】心门守卫 (Gatekeeper)免安装中文版

类型&#xff1a; 动作, 小游戏, 肉鸽 链接&#xff1a;https://pan.quark.cn/s/c39a046197d9 游戏简介 一股强大的恶势力偷走了寰宇之心。你必须勇闯一个未知宇宙并重新夺回失窃的心脏。但是你的任务并没有表面上的那么简单&#xff1a;寰宇之心被藏在了一座量子牢笼之中&am…

作者头像 李华
网站建设 2026/2/9 7:20:06

外包干了5天,技术明显退步

我是一名本科生&#xff0c;自2019年起&#xff0c;我便在南京某软件公司担任功能测试的工作。这份工作虽然稳定&#xff0c;但日复一日的重复性工作让我逐渐陷入了舒适区&#xff0c;失去了前进的动力。两年的时光匆匆流逝&#xff0c;我却在原地踏步&#xff0c;技术没有丝毫…

作者头像 李华
网站建设 2026/2/7 1:56:35

能源化工领域,SpringMVC如何支持百M级别大文件的上传下载监控?

大文件传输解决方案技术方案 项目需求分析 根据贵司提出的需求&#xff0c;我整理出以下关键点&#xff1a; 超大文件传输能力&#xff08;50G-100G级别&#xff09;完整的文件夹传输及层级结构保留高稳定性断点续传&#xff08;跨会话保持&#xff09;数据安全要求&#xf…

作者头像 李华