【已解决】Redis序列化反序列化不一致 - String类型值多了双引号问题

2023-12-21

在项目中使用spring 的RedisTemplate从redis中获取数据的时候,发现字符串的value多了双引号。如下图所示:

产生的原因可以分一下几个方面:

一、采用的序列化对象不同

多服务之间调用时候,序列化服务A(向redis中写数据的)和反序化服务B(向redis中读数据的)使用的序列化方式不同导致。

比如序列化服务A,使用的是Jackson2JsonRedisSerializer方式

反序化服务B,使用的是FastJson2JsonRedisSerializer 方式

两个服务序列化方式不同可能导致读取到的数据不一致问题。

对于此种情况,可以统一序列化方式。也就是使用同样的序列化方式,可能可以解决此问题。

二、@Autowired和@Resource导致

先来复习下spring的@Autowired和@Resource的区别

①:@Resource默认就是通过beanName注入的

②:@Autowired注解默认是按照BeanClass即BeanType进行注入的

场景说明:
写入redis和读取redis是同一个服务。那么序列化方式当然也是同样的了。可是为什么还会出现这种读取时候多了双引号问题呢?

先来看看向redis写数据时候

可以看到使用的是@Autowired注解。

我们知道@Autowired注解默认是按照BeanClass即BeanType进行注入的,此时注入的RedisTemplate却不是我们上面配置的,而是SpringBoot自动配置的。

在RedisAutoConfiguration中:

@Bean
	@ConditionalOnMissingBean(name = "redisTemplate")
	public RedisTemplate<Object, Object> redisTemplate(
			RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
		RedisTemplate<Object, Object> template = new RedisTemplate<>();
		template.setConnectionFactory(redisConnectionFactory);
		return template;
	}

我们看到,我们配置的与SpringBoot默认的redisTemplate不相同。

通过打断点进行对比:
SpringBoot默认的:

我们自己定义的:

可以看到,在valueSerializer上,一个是StringRedisSerializer,一个是Jackson2JsonRedisSerializer。

所以,在序列化与反序列化的方式不同时,产生这种乱码,奇怪的双引号问题也就可以解释了。

解决方案

将序列化反序列化方式改成一致。

这里就把序列化配置贴出来:

@Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
        template.setConnectionFactory(factory);
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        // key采用String的序列化方式
        template.setKeySerializer(stringRedisSerializer);
        // hash的key也采用String的序列化方式
        template.setHashKeySerializer(stringRedisSerializer);
        // value序列化方式采用jackson
        template.setValueSerializer(stringRedisSerializer);
        // hash的value序列化方式采用jackson
        template.setHashValueSerializer(stringRedisSerializer);
        template.afterPropertiesSet();
        return template;
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【已解决】Redis序列化反序列化不一致 - String类型值多了双引号问题 的相关文章

  • 找不到模块“socket.io/node_modules/redis”

    当尝试做的时候 var redis require socket io node modules redis 我收到错误 找不到模块 socket io node modules redis 我不明白为什么 我正在运行 Windows 并运
  • 使用 EVAL、SCAN 和 DEL 的 Redis 通配符删除脚本返回“非确定性命令后不允许写入命令”

    因此 我正在寻求构建一个 lua 脚本 该脚本使用 SCAN 根据模式查找键并删除它们 原子地 我首先准备了以下脚本 local keys local done false local cursor 0 repeat local resul
  • 如何使用注解配置的 MyBatis 指定 IN param 类型

    如果我希望能够传递空值 我似乎需要明确告诉 MyBatis java util Date IN 参数使用什么数据库类型 但我找不到办法做到这一点 我尝试了以下不同的变体 但没有成功 Select List
  • 如何从 python 将无穷大传递给 redis?

    我正在使用 redis py 并希望将 inf 和 inf 与 ZRANGEBYSCORE 一起使用 我尝试使用 inf 的字符串和浮点来执行此操作 但它们返回一个空集 我怎样才能做到这一点 EDIT 我尝试执行以下命令 redis Str
  • 保护节点 Redis

    我正在尝试保护 Node Redis IPC 服务器以使用私钥 公钥 我已经关注了本教程 http bencane com 2014 02 18 sending redis traffic through an ssl tunnel wit
  • 如何让客户端下载动态生成的非常大的文件

    我有一个导出功能 可以读取整个数据库并创建一个包含所有记录的 xls 文件 然后文件被发送到客户端 当然 导出完整数据库的时间需要大量时间 并且请求很快就会以超时错误结束 处理这种情况的最佳解决方案是什么 例如 我听说过使用 Redis 创
  • 如何在节点redis客户端上设置读取超时?

    在 github 上我没有看到读取超时的选项 https github com NodeRedis node redis https github com NodeRedis node redis There s connect timeo
  • Redis hash写入速度非常慢

    我面临一个非常奇怪的问题 使用 Redis 时 我的写入速度非常糟糕 在理想的情况下 写入速度应该接近 RAM 上的写入速度 这是我的基准 package redisbenchmark import redis clients jedis
  • Redis INCRBY 有限制

    我想知道是否有一种方法可以通过我的应用程序的单次往返在 Redis 中执行此操作 对于给定的键K 其可能值V是范围内的任意整数 A B 基本上 它有上限和下限 When an INCRBY or DECRBY发出命令 例如INCRBY ke
  • redis 阻塞直到 key 存在

    我是 Redis 新手 想知道是否有办法能够await get通过它的键来获取值 直到该键存在 最小代码 async def handler data await self fetch key async def fetch key ret
  • 在 Kubernetes/Openshift 中将客户端-服务器流量保持在同一区域的最佳方法?

    我们运行兼容 Kubernetes OKD 3 11 的本地 私有云集群 其中后端应用程序与用作缓存和 K V 存储的低延迟 Redis 数据库进行通信 新的架构设计将在两个地理上分布的数据中心 区域 之间平均划分工作节点 我们可以假设节点
  • 在 sidekiq 上配置 redis 身份验证

    我想我错过了一些东西 因为我在文档中找不到如何编写 redis 实例的用户名和密码以与 sidekiq 一起使用 有没有办法做到这一点 或者是通过 ENV 变量 Sidekiq 将无法识别的 Redis 选项直接传递给 Redis 驱动程序
  • 如何将node.js管道传输到redis?

    我有很多数据要插入 SET INCR 到redis DB 所以我正在寻找pipeline http redis io topics pipelining 质量插入 http redis io topics mass insert通过node
  • 使用Redis从有限范围内生成唯一ID

    我有一些数据库项目 除了主键之外 还需要项目所属组的唯一索引 我们来调用属性nbr 以及将项目分组在一起并定义唯一范围的属性nbr 我们会打电话group This nbr必须在 1 N 范围内 并且may从外部源导入项目时进行设置 由于所
  • 如何在Redis中进行持久化存储?

    关闭redis服务器后 使用set存储的值被破坏 在这里我找到了使用持久性存储的方法 有人帮助我 如何使用javascript实现这一点 我想将客户端的一些值存储在 redis 数据库中 并且必须在其他客户端中使用该值 您需要配置 Redi
  • MyBatis Spring Boot 自定义类型处理程序

    我需要 Spring Boot 和 MyBatis 集成方面的帮助 我对自定义 BaseTypeHandler 有疑问 我创建了一个映射器 MappedTypes LocalDateTime class public class Local
  • 如何在Redis中从hmset()切换到hset()?

    我收到弃用警告 即 Redis hmset 已弃用 请改用 Redis hset 但是 hset 采用第三个参数 我不知道是什么name应该是 info users 10 timestamp datetime utcnow strftime
  • Lua中按字符分割字符串

    我有像这样的字符串 ABC DEF 我需要将它们分开 字符并将两个部分分别分配给一个变量 在 Ruby 中 我会这样做 a b ABC DEF split 显然Lua没有这么简单的方法 经过一番挖掘后 我找不到一种简短的方法来实现我所追求的
  • Redis Cluster 与 Pub/Sub 中的 ZeroMQ,用于水平扩展的分布式系统

    如果我要设计一个巨大的分布式系统 其吞吐量应随系统中的订阅者数量和通道数量线性扩展 哪个会更好 1 Redis集群 仅适用于Redis 3 0 alpha 如果是集群模式 您可以在一个节点上发布并在另一个完全不同的节点上订阅 消息将传播并到
  • 使用 Sentinels 升级 Redis 的最佳实践?

    我有 3 个 Redis 节点 由 3 个哨兵监视 我进行了搜索 文档似乎不清楚如何最好地升级此类配置 我目前使用的是 3 0 6 版本 我想升级到最新的 5 0 5 我对这方面的程序有几个疑问 升级两个大版本可以吗 我在我们的暂存环境中执

随机推荐

  • Mybatis-plus可视化自动生成代码,提高开发效率神器!

    程序员的公众号 源1024 获取更多资料 无加密无套路 最近整理了一波电子书籍资料 包含 Effective Java中文版 第2版 深入JAVA虚拟机 重构改善既有代码设计 MySQL高性能 第3版 Java并发编程实战 等等 获取方式
  • 学习使用echarts图表中formatter的用法,格式化数字金额,控制x轴、y轴展示长度

    学习使用echarts图表中formatter的用法 格式化数字金额 控制x轴 y轴展示长度 控制金额长度 两位小数 并去除多余 00 效果图 控制文字长度 完整代码 控制金额长度
  • 干货!什么是财务业务化和业务财务化?

    此回答摘录自 自价值财务 以业务与财务的双向奔赴 成就合规与增长双赢 原文近7000字 作者 纷享销客CFO郭保彬先生 更多业财一体化内容详见纷享销客最新专刊 上市公司如何打好合规与增长双赢之战 如今 财务管理已经不再仅限于传统的会计和财务
  • 管理型交换机的优势与配置策略

    在现代网络架构中 管理型交换机 扮演着至关重要的角色 它们相比非管理型交换机 提供了更多的功能和灵活性 管理型交换机的优势 增强的安全性 管理型交换机通过访问控制列表 ACL 和端口安全等功能 有效地防止未授权访问 可配置性和灵活性 用户可
  • 【华为机试真题 Python】开放日活动、取出尽量少的球

    题目描述 某部门开展Family Day开放日活动 其中有个从桶里取球的游戏 游戏规则如下 有N个容量一样的小桶等距排开 且每个小桶都默认装了数量不等的小球 每个小桶装的小球数量记录在数组 bucketBallNums 中 游戏开始时 要求
  • 【08】GeoScene产品发布海图服务——以s57数据标准为例

    在GeoScene产品中发布海图服务 以s57数据标准为例 发布的服务方便不同的客户终端调用 例如 web端通过JS api进行调用 移动端通过GeoScene Runtime SDK进行调用 1 海图服务部署 GeoScene Marit
  • Zoho Mail:1600万企业用户的信赖之选

    Zoho Mail和Workplace在线办公套件一起 已经成长为一个集邮箱 即时通讯 生产力工具于一身的非常全面的强大平台 经过数十年持续深入的研发投入 我们的产品可以很好地服务大型企业 这是Zoho创始人斯瑞达 温布在Zoho Mail
  • 七款创意项目管理软件解决方案推荐:高效项目管理与团队协作工具

    企业无论大小 都离不开项目经理 营销团队和创意人员 他们参与各种头脑风暴 为特定目标打造项目 然而 在创意项目管理中 细节决定成败 若处理不当 可能导致项目失败和混乱 过去 创意项目管理依赖纸质规划文件 如今 科技的崛起让以创新方式规划 跟
  • 邮件进入垃圾邮箱的三大原因及避免方法:有效防止邮件被误判

    经常使用邮件的人 特别是用邮件做营销宣传的企业 可能会遇到这样的问题 发出去的邮件总是进垃圾箱 不仅没起到营销作用 还可能会让邮箱造成被封的风险 怎么避免 我们先来了解 为什么邮件会进垃圾箱 Q1 为什么邮件会进垃圾箱 1 邮件内容质量差
  • 数据库常见面试题 —— 14.数据库高并发问题如何解决

    增加缓存 在web层和db层之间增加一层缓存 减少数据库读取负担 提高数据读取速度 业务拆分 根据业务规模和需求 将业务拆分成多个模块 每个模块使用单独的数据库进行存储 以提高系统吞吐量和可用性 使用主从复制 读写分离 通过主从复制技术实现
  • linux 杀死指定端口的进程

    利用kill 9 和 ss antlup命令 kill 9 ss antlup grep 18100 awk print 7 awk F print 3
  • 164页,2023新版《Java面试手册》,抓住机会向前冲

    小伙伴们 2023新版 Java面试手册 来啦 这本小册子总计164页 全都是面试中的高频题目 有兴趣的小伙伴们不妨来看一下 为上岸做一下准备 由于全部内容过多 下面截取部分内容截图 大家可以先来大体看一下 Java基础 由于平台文章篇幅限
  • 大创项目推荐 深度学习 机器视觉 车位识别车道线检测 - python opencv

    0 前言 优质竞赛项目系列 今天要分享的是 深度学习 机器视觉 车位识别车道线检测 该项目较为新颖 适合作为竞赛课题方向 学长非常推荐 学长这里给一个题目综合评分 每项满分5分 难度系数 3分 工作量 3分 创新点 4分 更多资料 项目分享
  • 3D可视化大屏:赋能行业数据可视化应用,让数据更鲜活

    互联网时代 各种数据信息充斥在我们的生活中 对于大量的数据 我们也需要大量的时间才能去分析理解 因此3D可视化大屏的展示无疑是令人兴奋的进步 3D数据大屏能够将数据以更加直观 更加生动的方式呈现出来 结合VR全景技术 将数据立体化 三维化
  • nuxt学习笔记

    主要看的课程1 课程1 课程2 上手简化版 初始化 1 创建项目 使用官方推荐的npx来安装 npm的5 2 x版本后默认安装了npx 首先 确保您已经安装了 yarn npx 默认包含在 npm v5 2 中 或 npm v6 1 使用
  • 性能测试:Jmeter压测过程中的短信验证码读取

    问题背景 现如今国内的大部分软件或者网站应用 普遍流行使用短信业务 比如登录 注册以及特定的业务通知等 对于这些业务 在使用Jmeter进行性能测试的过程中 就会需要自动获取和填入短信验证码 否则性能流程无法进行下去 由于绝大多数的系统其短
  • Python_Tkinter和OpenCV模拟行星凌日传输光度测定

    传输光度测定 在天文学中 当相对较小的天体直接经过较大天体的圆盘和观察者之间时 就会发生凌日 当小物体移过较大物体的表面时 较大物体会稍微变暗 最著名的凌日是水星和金星对太阳的凌日 借助当今的技术 天文学家可以在凌日事件期间探测到遥远恒星光
  • 异步FIFO设计之格雷码

    目录 二进制转格雷码 格雷码转二进制 相邻的格雷码只有1bit的差异 因此格雷码常常用于异步fifo设计中 保证afifo的读地址 或写地址 被写时钟 或读时钟 采样时最多只有1bit发生跳变 在不考虑路径延时的情况下 因为源数据 读写地址
  • JMeter 性能测试基本过程及示例

    jmeter 为性能测试提供了一下特色 jmeter 可以对测试静态资源 例如 js html 等 以及动态资源 例如 php jsp ajax 等等 进行性能测试 jmeter 可以挖掘出系统最大能处理的并发用户数 jmeter 提供了一
  • 【已解决】Redis序列化反序列化不一致 - String类型值多了双引号问题

    在项目中使用spring 的RedisTemplate从redis中获取数据的时候 发现字符串的value多了双引号 如下图所示 产生的原因可以分一下几个方面 一 采用的序列化对象不同 多服务之间调用时候 序列化服务A 向redis中写数据