记一次jedis版本bug导致的线上异常

线上项目使用了jedis2.10.0客户端来管理和操作redis,上线一段时间后,发现系统hang住,无任何反应,查看了日志、系统负载等,均未发现异常,jstack了线程dump发现了如下异常:

即从commons-pool2(jedis中使用了org.apache.commons.pool2池化技术来做连接池)中获取资源时hang住;至此,找到了系统挂起的直接原因;


作为一线开发人员,想让自己的技术水平进一步的提高,不断地充电和学习是唯一的方式,最近本猿就在充电这两门视频课程,还不错,推荐给大家,共勉ヾ(◍°∇°◍)ノ゙


 

进一步jmap了内存快照,进行了分析,如下,发现最后一次borrow走使用后(距离系统出异常前好几天)未归还(注意,线上项目这里使用了redisTemplate的全部默认配置,包括线程池maxtotal=8, maxwait=-1[无可用连接时无限等待]),表明,连接池中的连接出现泄漏【池化对象的状态一直为allocated,一直不归还】,当新来的连接时,发现已达maxtotal,故无限等待

查阅jedis官网issues,果然发现了一个该case的重大bug, isuess地址:JedisPool exhausted in Jedis 2.10.0 · Issue #1920 · redis/jedis

造成bug的相关原理和代码段如下:

按照官网的建议,升级了jedis的版本到jedis2.10.2,重新进行了压力测试,未再发现异常,至此,问题解决

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,JedisRedis官方推荐的Java连接开发工具。在Java项目中整合Jedis并连接Redis数据库的步骤如下: 1. 在pom.xml文件中添加Jedis的Maven依赖: ```xml <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>3.7.0</version> </dependency> ``` 请确保版本号与您使用的Redis版本兼容。 2. 编写Jedis连接代码: ```java import redis.clients.jedis.Jedis; public class JedisTest { public static void main(String[] args) { // 创建连接 Jedis jedis = new Jedis("192.168.56.103", 6379); // 执行命令 jedis.set("name", "fengxiansheng"); // 释放连接 jedis.close(); } } ``` 请将`192.168.56.103`替换为您的Redis服务器IP地址,并根据需要执行其他命令。 另外,为了提高性能和线程安全性,可以使用连接池来管理Jedis对象。以下是使用Jedis连接池的示例代码: ```java import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; public class JedisPoolTest { public static void main(String[] args) { JedisPoolConfig poolConfig = new JedisPoolConfig(); poolConfig.setMaxTotal(2); // 设置最大连接数 poolConfig.setMaxIdle(2); // 设置最大空闲连接数 poolConfig.setTestOnBorrow(true); // 获取jedis时做有效性检测 JedisPool jedisPool = new JedisPool(poolConfig, "192.168.56.103", 6379); Jedis jedis1 = jedisPool.getResource(); Jedis jedis2 = jedisPool.getResource(); // jedis1、jedis2 不需要手动释放连接 Jedis jedis3 = jedisPool.getResource(); } } ``` 这样可以复用连接对象,提高性能并避免频繁创建和销毁Jedis对象。 回答完问题后的相关问题: 相关问题: 1. Redis Jedis支持哪些数据类型? 2. Jedis连接池的作用是什么? 3. 如何在Jedis中使用事务操作?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值