最近在做基于netty的聊天室,消息接收和发送使用了netty,业务处理又引入了Disruptor,再加上项目中对外的接口也使用了redis,此后Jedis访问redis就会经常报错。
java.lang.ClassCastException: java.lang.Long cannot be cast to java.util.List
at redis.clients.jedis.Connection.getRawObjectMultiBulkReply(Connection.java:230)
at redis.clients.jedis.Connection.getObjectMultiBulkReply(Connection.java:236)
最开始以为是redis服务的问题,后来查阅文章和自己分析报错发现这个错误是多线程环境下引发的问题。
因为redis的一大特性就是单线程,Jedis在设计上也就使用了单线程访问redis,如果在多线程的环境下调用,就会引发返回结果类型的混乱,因此Jedis在使用中不能仅仅为单例模式,但是每次使用new一个Jedis对象又过于消耗资源,因此Jedis提供了一个JedisPool的类用来池化Jedis对象。
我通过网上的资料和自己的实际情况整合了一个工具类,以下是源码:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import java.util.Set;
import r