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

2023-12-20

在项目中使用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类型值多了双引号问题 的相关文章

  • 保护节点 Redis

    我正在尝试保护 Node Redis IPC 服务器以使用私钥 公钥 我已经关注了本教程 http bencane com 2014 02 18 sending redis traffic through an ssl tunnel wit
  • Redis 块推送直到列表有空位

    我正在寻找类似的东西BLPUSH该命令将阻塞 直到列表的长度低于指定值max size 目的是防止生产者运行速度快于消费者时列表无限增长 功能与 python 非常相似Queue put https docs python org 3 li
  • python 3.5 中的 json.loads 和 Redis

    我使用 json dumps 创建了一个 JSON 对象 并在 Redis 列表中将其 RPUSH ed 当使用 LRANGE redis lrange 返回 JSON 时 我收到一个二进制字符串 b si 00 ff 所以 json lo
  • 仅当尚未设置时才进行原子设置

    仅当尚未在 Redis 中设置时 是否有办法执行原子设置 具体来说 我正在创建一个像 myapp user user email 这样的用户 并且希望 Redis 在 user email 已被占用时返回错误 而不是默默地替换旧值 比如声明
  • PooledRedisClientManager 未释放连接

    我将 json 数据列表存储在 redis 中并使用 ServiceStack c 客户端访问它 我本质上是在管理自己的外键 我在其中存储zrangeid 我使用应用程序内部的接口从zrange然后从 Redis 获取底层 json 对象并
  • Redis键空间事件不触发

    我有两个 Redis 客户端 在一个文件中我有一个简单的脚本设置并删除了 Redis 键 var redis require redis var client redis createClient 6379 127 0 0 1 client
  • WSL Redis 遇到系统尚未使用 systemd 作为 init 系统(PID 1)启动。无法操作[已关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在尝试遵循本文中讨论的 Redis 安装过程article https www digitalocean com community
  • Docker-compose Predis 不通过 PHP 连接

    我正在尝试使用 docker compose 将 PHP 与 redis 连接 docker compose yml version 2 services redis image redis 3 2 2 php image company
  • 如何批量删除Redis中数十万个带有特殊字符的key

    我们有一个包含数十万个 Redis 键的列表 其中包含各种特殊字符 我们希望批量删除它们 对于这个问题上的类似问题 有一些很好的答案 如何使用 Redis 自动删除与模式匹配的键 https stackoverflow com questi
  • redis 阻塞直到 key 存在

    我是 Redis 新手 想知道是否有办法能够await get通过它的键来获取值 直到该键存在 最小代码 async def handler data await self fetch key async def fetch key ret
  • 如何测试我的 Redis 缓存是否正常工作?

    我已经安装了 django redis cache 和 redis py 我遵循了 Django 的缓存文档 据我所知 以下设置就是我所需要的 但我如何判断它是否正常工作 设置 py CACHES default BACKEND redis
  • socket.io 广播功能 & Redis pub/sub 架构

    如果有人能帮助我解决一个小疑问 我将不胜感激 使用socket io广播功能和在Redis上使用pub sub设计架构有什么区别 例如 在另一个示例中 node js 服务器正在侦听 socket io 针对 键 模型 todo 和值 数据
  • Redis发布/订阅:查看当前订阅了哪些频道

    我目前有兴趣查看我拥有的 Redis 发布 订阅应用程序中订阅了哪些频道 当客户端连接到我们的服务器时 我们将它们注册到如下所示的通道 user user id 这样做的原因是我希望能够看到谁 在线 目前 我在不知道客户端是否在线的情况下盲
  • MyBatis Spring Boot 自定义类型处理程序

    我需要 Spring Boot 和 MyBatis 集成方面的帮助 我对自定义 BaseTypeHandler 有疑问 我创建了一个映射器 MappedTypes LocalDateTime class public class Local
  • Redis、会话过期和反向查找

    我目前正在构建一个网络应用程序 并想使用 Redis 来存储会话 登录时 会话会使用相应的用户 ID 插入到 Redis 中 并且过期时间设置为 15 分钟 我现在想实现会话的反向查找 获取具有特定用户 ID 的会话 这里的问题是 由于我无
  • 2 个具有共享 Redis 依赖的 Helm Chart

    目前 我有 2 个 Helm Charts Chart A 和 Chart B Chart A 和 Chart B 对 Redis 实例具有相同的依赖关系 如Chart yaml file dependencies name redis v
  • Redis是如何实现高吞吐量和高性能的?

    我知道这是一个非常普遍的问题 但是 我想了解允许 Redis 或 MemCached Cassandra 等缓存 以惊人的性能极限工作的主要架构决策是什么 如何维持连接 连接是 TCP 还是 HTTP 我知道它完全是用C写的 内存是如何管理
  • 使用 Celery 通过 Gevent 进行实时、同步的外部 API 查询

    我正在开发一个 Web 应用程序 该应用程序将接收用户的请求 并且必须调用许多外部 API 来编写对该请求的答案 这可以直接从主 Web 线程使用 gevent 之类的东西来扇出请求来完成 或者 我在想 我可以将传入的请求放入队列中 并使用
  • redis 2.8.7 Linux Sentinel环境配置问题,如何使其自启动,应该订阅什么?

    现在我们尝试使用 redis 2 8 7 作为缓存存储 来自使用 booksleeve 客户端的 NET Web 应用程序 目前看来这是一个非常有趣和令人兴奋的任务 redis 文档非常好 但由于缺乏真正的实践经验 我确实有几个关于如何正确
  • mybatis:使用带有 XML 配置的映射器接口作为全局参数

    我喜欢使用 XML 表示法来指定全局参数 例如连接字符串 我也喜欢 Mapper 注释 当我尝试将两者结合起来时 我得到这个例外 https stackoverflow com questions 4263832 type interfac

随机推荐

  • 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中写数据