美文网首页
jedis在多线程下的一个大坑

jedis在多线程下的一个大坑

作者: 许武顺 | 来源:发表于2016-11-21 14:11 被阅读2316次

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

    相关文章

      网友评论

          本文标题:jedis在多线程下的一个大坑

          本文链接:https://www.haomeiwen.com/subject/cpjupttx.html