Redis Connection Factory 问题记录

Redis Connection Factory 问题记录


复制了一段代码,声明了一个RedisTemplate,然后执行executePipelined,发现报错。

@Resource
private RedisTemplate<String, String> redisTemplate;

Result result = redisTemplate.executePipelined(new RedisCallback<String>() {
            @Override
            public String doInRedis(RedisConnection connection) throws DataAccessException {
                StringRedisConnection conn = (StringRedisConnection) connection;
                ......
                return null;
            }
        });

具体报错的就是这行,

StringRedisConnection conn = (StringRedisConnection) connection;

报错信息:

java.lang.ClassCastException: com.sun.proxy.$Proxy366 cannot be cast to org.springframework.data.redis.connection.StringRedisConnection

原代码是没报错的:

@Resource
private RedisTemplate<String, String> stringTemplate;

Result result = stringTemplate.executePipelined(new RedisCallback<String>() {
            @Override
            public String doInRedis(RedisConnection connection) throws DataAccessException {
                StringRedisConnection conn = (StringRedisConnection) connection;
                ......
                return null;
            }
        });

比较了半天,唯一的不同就是变量名:stringTemplate 和 redisTemplate。修改之后发现,确实没问题了。。。

进一步跟踪代码发现了问题原因:
首先,
redisTemplate 和 stringTemplate 不是同一个类的实例:
redisTemplate 是 RedisTemplate的一个实例
stringTemplate 是 StringRedisTemplate的一个实例;这是由于byName没找到,所以通过byType,找到了 StringRedisTemplate;StringRedisTemplate extend RedisTemplate;

其次:
redisTempalte 他的connection 是 jedisConnection;
stringTempalte 他的connection 是 StringRedisConnection;
这两个都是继承自 RedisConnection,所以在强制转换的时候报错了。jedisConnection 不能强制转换为 StringRedisConnection。

(StringRedisConnection) connection;

究其愿意,是因为项目中声明了一个redisTemplate的bean,并且设置 connectionFactory 为 JedisConnectionFactory

redisTemplate.setConnectionFactory(jedisConnFactory);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值