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

    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/336535.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

松鼠目标检测数据集VOC格式400张

松鼠,一种小巧玲珑、活泼可爱的啮齿类动物,以其蓬松的大尾巴和机敏的动作而广受欢迎。 松鼠通常体型小巧,四肢灵活,尾巴蓬松。它们的耳朵大而直立,眼睛明亮,给人留下了深刻的印象。松鼠的毛色因种类而异&a…

深入理解Word Embeddings:Word2Vec技术与应用

目录 前言1 Word2Vec概述2 CBOW模型2.1 CBOW模型简介2.2 基于词袋(bag of word)的假设2.3 One-hot向量编码2.4 分类问题 3 Skip-gram模型3.1 Skip-gram模型简介3.2 目标词预测上下文3.3 词语关联性的捕捉 4 优化Word2Vec模型的方法4.1 负采样和分层softm…

Python(34):Python调用request上传文件用unittest执行时报错ResourceWarning

Python调用request上传文件用unittest执行时报错ResourceWarning 报错信息: ResourceWarning: Enable tracemalloc to get the object allocation traceback 解决方法1:可以通过忽略来去掉警告 1、导入:import warnings 2、添加&#xff…

Vue项目在ie浏览器中显示白屏优化提示

在工作中用到Vue开发项目,用户在IE浏览器打开页面,结果显示空白屏。作为开发者当然知道是浏览器版本过低导致语法不支持,但是用户不知情的情况下显示空白屏就很不友好。这时候有必要在页面上做点提示语告诉用户切换浏览器,下面是页…

.NET Framework 与 .NET Core 与 .NET Standard 之间的差异

介绍 在本文中,我们将探讨 .NET Framework、.NET Core 和 .NET Standard 之间的差异。 .NET Framework 与 .NET Core .NET框架.NET核心 历史 .NET Framework 是 .NET 的第一个实现。 .NET Core 是 .NET 的最新实现。 开源 .NET Framework 的某些组件是开源的。 .N…

游戏引擎支持脚本编程有啥好处

很多游戏引擎都支持脚本编程。Unity、Unreal Engine、CryEngine等大型游戏引擎都支持使用脚本编写游戏逻辑和功能。脚本编程通常使用C#、Lua或Python等编程语言,并且可以与游戏引擎的API进行交互来控制游戏对象、设置变量、执行行为等。使用脚本编程,游戏…

无线与局域网技术期末划题自制答案

简答题 1.描述5G的三大应用场景? 5G的三大应用场景包括增强型移动宽带(eMBB)、超可靠低延迟通信(URLLC)和大规模机器类型通信(mMTC)。增强型移动宽带(eMBB)主要用于支持…

1881_S32K344开发工具以及MCAL软件安装

全部学习汇总: GreyZhang/g_s32k344: A new MCU learning notes. I would try to use MCAL instead of SDK. (github.com) 编译有专门的编译器安装包,也有IDE的安装形式。这里我选择了IDE,因为我还需要一个开发调试环境。这个IDE可以让我方便…

Postman工具使用一篇快速入门教程

文章目录 下载安装注册登录CollectionFolderRequestGet请求Post请求Header设置Response响应 EnvironmentsGlobal环境变量其他环境变量Collection变量变量使用同名变量的优先级 Postman内置变量Pre-request script和Test script脚本设置、删除和获取变量获取请求参数获取响应数据…

Simpy简介:python仿真模拟库-03/5

一、说明 在过去的两篇文章中,我们了解了 simpy 的基础知识、声明变量和处理表达式。值得注意的例子包括评估导数和积分。现在,让我们继续使用函数。 二、SymPy — 函数类 SymPy 包包含 sympy.core.function 模块中的 Function 类。该类作为各种数学函数…

Linux——firewalld防火墙(一)

一、Linux防火墙基础 Linux 的防火墙体系主要工作在网络层.针对TCP/P数据包实时过滤和限制.属于典型的包过滤防火墙(或称为网络层防火墙)。Linux系统的防火墙体系基于内核编码实现.具有非常稳定的性能和高效率,也因此获得广泛的应用.在CentOS 7系统中几种…

【办公类-19-01】20240108图书统计登记表制作(23个班级)EXCEL复制表格并合并表格

背景需求: 制作一个EXCEL模板,每个班级的班主任统计 班级图书量(一个孩子10本,最多35个孩子350本) EXCEL模板 1.0版本: 将这个模板制作N份——每班一份 项目:班级图书统计表 核心:一个EXCEL模板批量生成…