redis键值出现 \xac\xed\x00\x05t\x00&的解决方法

2023-10-31

笔者在使用redis存放键值对时,发现存放的key和value多了\xac\xed\x00\x05t\x00&的前缀,笔者存放的是字符串,结果如下图所示,出现非预期的前缀。
在这里插入图片描述
出现该问题的原因是, redis template向redis存放使用java对象序列化的值,序列化方式和string的一般方式不同。


明明指定的另一个引文字符串作为key,但是实际存储后却多出来一串奇异字符串,这让笔者好奇心顿时升起来了,决定debug调试一下
在这里插入图片描述
从set()方法进入一路对execute()的重载方法向下跟踪,最终来到了一个T result = action.doInRedis(connToExpose);代码处

在这里插入图片描述
step into 进入doInRedis方法,
在这里插入图片描述

可以看到在一开始传入的匿名对象就是这个ValueDeserializingRedisCallback抽象类的一个匿名子类,并实现了set方法的最后一步,将数据存入redis。

来看看我的字符串key是怎么转化成byte数组的。对rawKey方法向下追踪…

  1. 获取Key的序列化器,然后对我们的key进行序列化
    在这里插入图片描述

    在这里插入图片描述

    进入serialize(key)方法,执行了JdkSerializationRedisSerializer类中的serialize方法。继续向下跟踪…
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述

最终!!!!,原来是使用了JDK自带的ObjectOutPutStream将我们的String对象序列化成了byte[],
在这里插入图片描述

来看看我们把byte数组转回字符串key发现在我原本的key之前确实拼接了乱码的字符串。
在这里插入图片描述



RedisTemplate对Key的序列化了解了后,我们在看看对Value的序列化是怎么一回事?
在这里插入图片描述
在这里插入图片描述

最终结果是同样的使用JDK自带的对象输出流对其进行序列化。
在这里插入图片描述

在Key和Value都序列化后,将数据存入Redis。最终总结可以发现一切原因都是这个默认的JdkSerializationRedisSerializerJDKRedis序列化器的序列化方式不能让人接受。

知道了问题所在,这个问题就已经解决了一半了。

我们能不能不使用这个默认的JDKRedis序列化器,自己实现一个或者换一个呢?

很幸运,Spring已经为我们提供了许多类型的序列化器了
在这里插入图片描述
一般我们常用的序列化器是Jackson2JsonRedisSerializerStringRedisSerializer这两种。看名字就知道Jackson2JsonRedisSerializer是将对象序列化成JSON形式的序列化器了。

  • Jackson2JsonRedisSerializer:常用来直接序列化Value对象为JSON字符串。内部使用ObjectMapper
  • StringRedisSerializer:常用来序列化Key,也可以用来序列化Value。

于是乎我们对RedisTemplate进行配置:

/**
 * 如果key和value都使用的StringRedisSerializer序列化器,则推荐使用StringRedisTemplate
 *
 * 配置Redis的Key和Value的序列化器
 * @param redisTemplate 从容器中获取RedisTemplate
 * @return 修改后的RedisTemple
 */
@Bean
public RedisTemplate<Object, Object> redisStringTemplate(RedisTemplate<Object, Object> redisTemplate) {
    StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
    redisTemplate.setKeySerializer(stringRedisSerializer);
    // 如果手动将Value转换成了JSON,就不要再用JSON序列化器了。
    // redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<>(Object.class));
    redisTemplate.setValueSerializer(stringRedisSerializer);
    return redisTemplate;
}

查验结果:key和value的序列化和反序列化都正常了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

redis键值出现 \xac\xed\x00\x05t\x00&的解决方法 的相关文章

随机推荐

  • 你的数字藏品可能真的只是一张图片

    国外 NFT 市场的火爆也同样引燃了国内的市场 像腾讯 阿里等诸多大厂纷纷入局 同时 大量中小企业也在这些头部企业的带领下聚集而来 出于政策风险隐患的防范要求 国内的区块链并不是国外的公链 而是由一个或多个机构独立部署的联盟链 同时也将 N
  • CMD查看当前文件路径下的所有文件名

    介绍 我们知道Linux系统下查看当前文件路径下的所有文件名 可以用ls或ll来查看 那么CMD中怎么查看当前路径下的所有文件呢 方案 使用 dir 命令即可 效果如下
  • Go语言编程思想3——错误处理和资源管理

    Go语言编程思想3 错误处理和资源管理 资源管理 及时关闭文件 及时释放资源 如果打开的文件还未关闭就因为出错而在中间跳出 就无法保证有效的资源管理 因此在这里两者一起进行考虑 一 defer调用 调用在函数结束时发生 在return pa
  • echarts 调整x类目轴axisLabel间距

    场景 产品认为x轴的刻度太密集 需要稀一点 调研 关于这个需求 想到的有 xAxis interval 指定的是所有横坐标的间隔 需要自行计算间隔多少 xAxis splitNumber 对类目轴不生效 xAxis axisLabel fo
  • 【java 程序设计实训】学生请假管理系统

    学生请假管理系统 运行结果 学生请假管理系统需求分析 GUI 编程 事件处理 数据库编程 部分代码 项目结构 实体类 Admin java LeaveData java UserLogin java MainWindow java leav
  • 嵌入式linux 第二章:软件下载

    嵌入式linux 目录 第一章 vi 使用 第二章 软件下载 第三章 软件下载 嵌入式linux 一 软件下载模式 1 deb 1 1 下载 1 2 删除 2 apt get 2 1 下载 2 2 删除 2 3 清除缓存 查询软件包信息 一
  • 每日一题:订单编号

    订单编号 题目 Daimayuan Online Judge 一开始想用二分答案的 但是后来发现不行 二分答案每找到一个值 就要去掉它的左半边或右半边 但是这里不能去 错误代码 include
  • C++(CMake)视觉OpenCV-Raspberry Pi图像处理-3D图像重建-面部界标检测-卷积神经网络车牌自动识别-深度神经网络面部检测和识别

    演示如何为桌面和小型嵌入式系统 如 Raspberry Pi 编写一些图像处理过滤器 使用 SfM 模块将场景重建为稀疏点云 包括相机位姿 以及如何使用多视图立体获取密集点云 使用人脸模块进行人脸界标 也称为人脸标记 检测的过程 图像分割和
  • SpringBoot系统整理

    写在前面 很早之前看了狂神的springboot快速入门 后来发现还是有很多开发知识点需要补充学习 乘着假期 将基础篇 运维实用篇 开发实用篇 原理篇一口气学习巩固 再次记录下学习笔记 系列笔记在springboot中哦 目录 1 快速上手
  • 【基于协同过滤算法的电影推荐】

    目录 1 协同过滤算法 1 1 CF与 User Item 推荐算法区别 1 2 UserCF 1 3 ItemCF 2 评价指标 3 基于userCF与itemCF电影推荐 3 1 MovieLens数据集 3 2 userCF代码实现
  • Qt 5.15 安装步骤

    Qt 5 15 安装步骤 简单介绍 1 利用 MaintenanceTool exe 卸载Qt 2 卸载完成后重新安装 配置Visual Studio 2019 简单介绍 之前一直使用Qt 5 14 0版本 但是由于打包问题以及工作需要 要
  • python下timer定时器常用的两种实现方法

    前言 大家早好 午好 晚好吖 欢迎光临本文章 话不多说 直接开搞 如果有什么疑惑 资料需要的可以点击文章末尾名片领取源码 方法一 使用线程中现成的 这种一般比较常用 特别是在线程中的使用方法 下面是一个例子能够很清楚的说明它的具体使用方法
  • 解决ROS系统 rosdep update超时问题的新方法

    由于近期国内Github Raw的可用IP越来越少 通过修改hosts文件解决rosdep update超时问题的方法已经不太好用 本文通过修改rosdep源码中下载资源的函数来解决这一问题 网站https ghproxy com 支持gi
  • 从键盘输入一个字符串与一个指定字符,将字符串中出现的指定字符全部删除...

    include stdio h include conio h include string h void prochar char str char c char p for p str p 0 p if p c str p str 0
  • 基于深度学习的图像超分辨率重建技术的研究

    基于深度学习的图像超分辨率重建技术的研究 图像的超分辨率重建技术指的是将给定的低分辨率图像通过特定的算法恢复成相应的高分辨率图像 随着人工智能的不断发展 超分辨率重建技术在视频图像压缩传输 医学成像 遥感成像 视频感知与监控等领域得到了广泛
  • c++顺序表类模板及其可视化界面

    文章目录 概要 整体架构流程 技术名词解释 实现代码 小结 概要 本文包括利用c 编写的顺序表的类模板以及其可视化界面 整体架构流程 在sqList h头文件中定义一个SqList类模板 并在类模板中声明构造函数 析构函数和要实现的成员函数
  • PHP网站使用JavaScript和Iframe简单实现部分刷新效果

    本文主要是记录自己寒假作业PHP网站实现加载界面的文章 运行效果如下图所示 主要记录php html Apache开发网站的3个功能 方便以后阅读和其他人学习 1 如何实现简单页面布局 2 使用jsp如何实现隐藏与显示效果 3 通过ifra
  • 9. GraalVM.云原生时代的Java虚拟机

    JVM性能调优 1 GraalVM诞生的背景 1 1 Java在微服务 云原生时代的困境 1 1 1 事实 1 1 2 矛盾 本文是按照自己的理解进行笔记总结 如有不正确的地方 还望大佬多多指点纠正 勿喷 课程内容 1 Java在云原生时代
  • 云计算虚拟化技术与开发-------虚拟化技术应用第三、四章内容(QUME命令的讲解以及常用的QUME命令、创建虚拟机镜像文件以及启动虚拟机的常用QEMU命令)

    目录 第三章关于QUME的命令讲解 常用的QEMU命令 kvm的内存的配置 两种方式查看内存信息 查看QEMU支持的镜像文件格式 qemu img h 创造虚拟机镜像格式的命令 下面介绍qemu img的基本命令及语法 QUME中详细命令讲
  • redis键值出现 \xac\xed\x00\x05t\x00&的解决方法

    笔者在使用redis存放键值对时 发现存放的key和value多了 xac xed x00 x05t x00 的前缀 笔者存放的是字符串 结果如下图所示 出现非预期的前缀 出现该问题的原因是 redis template向redis存放使用