Spring Redis Client使用Hessian序列化HINCRBY命令的Bug

前言:

公司自己封装Redis Client架包,使用Hessian协议对Redis中Value值进行序列化。在使用Hash结构的HINCRBY命令,处理序列化异常的问题。下面,我将详细说明一下。

正文:

公司封装Redis Client架包,其实就是把Spring相关Redis代码改了改。所以,我就Spring的相关Redis代码进行复现。

首先,在Spring RedisTemplate中配置HashValue的序列化方式。

HessianRedisSerializer类:

我们在写一个测试类,具体代码如下:

复制代码
    @GetMapping("/test1")
    public String test1(Integer num) {

        if (num == 1) {
            redisTemplate.opsForHash().put("test", "1", "1");
            Object value = redisTemplate.opsForHash().get("test", "1");
            System.out.println(value);
        }

        if (num == 2) {
            redisTemplate.opsForHash().put("test", "2", "你好");
            Object value = redisTemplate.opsForHash().get("test", "2");
            System.out.println(value);
        }
        // 复现问题
        if(num ==3){
            Long l1 = redisTemplate.opsForHash().increment("test", "3", 1);
            System.out.println(l1);
            Object l2 = redisTemplate.opsForHash().get("test", "3");
            System.out.println(l2);
        }

        if (num ==4){
            Long l1 = redisTemplate.opsForValue().increment("test1");
            System.out.println(l1);
            Object l2 = redisTemplate.opsForValue().get("test1");
            System.out.println(l2);
        }

        return "ok";
    }

执行num == 1时,说明添加数字值,经过Hessian协议序列化后,存储到Redis服务端的值的格式:

执行num == 2时,说明添加中午值,经过Hessian协议序列化后,存储到Redis服务端的值的格式:

执行num == 3时,复现HINCRBY的Bug。通过以下截图,可以看出Redis服务端存储值的格式为正常数字值型,不是上述经过Hessian协议序列化后值的格式。所以运行相关代码后,报 反序列化对象失败错误。

执行num == 4时,说明String结构数据,使用String序列化方式没有问题。

最后,我使用画图的形式简单说明一下,为啥会报错。执行Hincrby命令时,直接调用相关命令,不用进行Hessian协议序列化。执行Hget命令时,调用相关命令,返回字节数组,经过Hessian协议序列化反序列化,报错抛异常。执行Hset命令时,先对值进行Hessian协议序列化,然后再执行相关命令。

结论:Redis中不建议使用Hessian作为序列化协议。建议使用JSON或String作为序列化协议。

相关推荐
Doker 多克2 小时前
Spring Integration AMQP 和 Spring AMQP详解
java·后端·spring
一条泥憨鱼3 小时前
【Redis | 黑马点评】基于Redis的消息队列 | stream消息队列 源码解读
java·数据库·redis·缓存·lua
每天一道题3 小时前
Redis 缓存为什么会出问题?穿透、击穿、雪崩与缓存一致性
数据库·redis·缓存
Qianxueban3 小时前
pexpire key底层逻辑是如何实现这个延迟功能?
redis
雷一言说4 小时前
Spring AI 2.0 Agent Skills 接入
spring
萧瑟余晖5 小时前
Spring Cloud综合实战与架构选型详解
spring·spring cloud·架构
charlotte102410245 小时前
Redis 简介:从诞生到数据类型,再到缓存三大问题
数据库·redis·缓存
硅基手札6 小时前
SPI技术系列 13 · SPI 调试与排查
linux·运维·stm32·单片机·嵌入式硬件·bug
一嘴一个橘子6 小时前
redis stream
redis
萧瑟余晖6 小时前
Spring Cloud Alibaba生态整合详解
spring·spring cloud·面试