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);