invalid stream header: 76616C75

java 项目操作redis ,有如下三种方式

  1.  使用 原生的 Jedis
  2.  使用 StringRedisTemplate
  3.  使用 RedisTemplate

但是他们并不是通用的,存取操作都涉及到 key value 的序列化和反序列化规则,

使用 Jedis 设置的key 再使用 StringRedisTemplate 进行get 是可以获取成功的,但是使用 RedisTemplate

就会报错 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 ,如果 RedisTemplate 设置了序列化规则都是 String 也是可以通用的

 

你可能感兴趣的:(Spring,Boot)