jedis在多线程下的一个大坑

最近使用jedis进行redis的数据操作,发现服务器运行一段时间之后,总是会出现莫名其妙的异常信息java.lang.ClassCastException: [B cannot be cast to java.lang.Long,


然后服务就当掉了。后来上网查了一下,发现好多人都遇到了同样的问题,原来是jedis操作redis的时候,对底层执行redis命令做了缓存,所以如果某一次redis操作出现异常,jedis实例中的缓存数据不会被清空,而直接放回连接池中。下一次从池中取出了同一个jedis对象,发送的命令用的还是上一个线程的数据。

所以如果两个线程使用的数据类型不一样,就会发生上面的问题。但是加入两个线程使用的数据类型是一样的,那么系统不会报异常,但是数据可能全是错乱的,后果将不可设想。

从某个角度上来看,这个问题也算是jedis的一个bug,为此我们可以自己封装一层redis操作,并在操作中捕获异常,然后用jedis.close()将redis连接关闭。


查看close()方法的底层实现,可以看到,当线程的jedis连接异常后,jedis对象会被置为invalid,并新建一个jedis对象放入连接池中



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值