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作为序列化协议

    

相关推荐

  1. Spark序列

    2024-01-10 07:06:04       9 阅读
  2. Kafka Avro序列之一:使用自定义序列

    2024-01-10 07:06:04       46 阅读
  3. 使用Jackson进行序列和反序列

    2024-01-10 07:06:04       19 阅读
  4. 在php中序列与反序列

    2024-01-10 07:06:04       11 阅读

最近更新

  1. 如何在vue3中实现动态路由

    2024-01-10 07:06:04       0 阅读
  2. 使用RAGAs评估基于Milvus Cloud的RAG应用

    2024-01-10 07:06:04       0 阅读
  3. electron通信与持久化存储

    2024-01-10 07:06:04       1 阅读
  4. Electron Forge 打包更改打包后图片

    2024-01-10 07:06:04       1 阅读
  5. 【ES】--Elasticsearch的高亮模式

    2024-01-10 07:06:04       1 阅读
  6. JVM专题九:JVM分代知识点梳理

    2024-01-10 07:06:04       1 阅读
  7. 谈谈检测浏览器类型

    2024-01-10 07:06:04       1 阅读
  8. npm 常用命令详解与实践

    2024-01-10 07:06:04       1 阅读

热门阅读

  1. Android studio TabHost应用设计

    2024-01-10 07:06:04       38 阅读
  2. SQL Server定时调用指定WebApi接口

    2024-01-10 07:06:04       38 阅读
  3. VSCode 安装 Copilot 详细过程和实例

    2024-01-10 07:06:04       40 阅读
  4. 关于springboot项目集成kafka的常见错误

    2024-01-10 07:06:04       36 阅读
  5. kafka KRaft 集群搭建

    2024-01-10 07:06:04       39 阅读
  6. Kafka的@KafkaListener注解参数详解

    2024-01-10 07:06:04       33 阅读
  7. vue解析前端对象为Array数组并且遍历

    2024-01-10 07:06:04       34 阅读