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对象放入连接池中



相关推荐
©️2020 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页