java.lang.Long cannot be cast to java.util.List Jedis多线程环境下使用方案

本文探讨了在使用Jedis访问Redis时遇到的`java.lang.Long cannot be cast to java.util.List`错误,指出该问题是由于多线程环境引起的。由于Redis的单线程特性,Jedis设计为单线程访问。为解决资源消耗和线程安全问题,推荐使用JedisPool进行对象池化。文中提供了一个基于枚举的Jedis工具类示例,简化多线程环境下的Jedis调用。
摘要由CSDN通过智能技术生成

最近在做基于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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值