java 项目操作redis ,有如下三种方式
- 使用 原生的 Jedis
- 使用 StringRedisTemplate
- 使用 RedisTemplate<Object,Object>
但是他们并不是通用的,存取操作都涉及到 key value 的序列化和反序列化规则,
使用 Jedis 设置的key 再使用 StringRedisTemplate 进行get 是可以获取成功的,但是使用 RedisTemplate<Object,Object>
就会报错 org.springframework.data.redis.serializer.SerializationException: Cannot deserialize; nested exception is org.springframework.core.serializer.support.SerializationFailedException: Failed to deserialize payload. Is the byte array a result of corresponding serialization for DefaultDeserializer?; nested exception is java.io.StreamCorruptedException: invalid stream header: 76616C75] with root cause,
key 的序列化规则不一样就会报错,
可以复制下面这段代码试一下
@Autowired
private Jedis jedis;
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Autowired
private RedisTemplate redisTemplate;
@RequestMapping("/testRedis")
@ResponseBody
public Object testRedis(){
String setex = jedis.setex("test1", 5, "value1");
String test1 = stringRedisTemplate.opsForValue().get("test1");
System.out.println(test1);
Object test11 = redisTemplate.opsForValue().get("test1");
System.out.println(test11);
jedis.close();
return test11;
}
代码执行到 redisTemplate.opsForValue().get("test1"); 就会报错,
jedis 和 StringRedisTemplate 可以通用是因为 key value 序列化规则一样。
StringRedisTemplate 继承 RedisTemplate<String, String> ,如果 RedisTemplate 设置了序列化规则都是 String 也是可以通用的