【问题排查】Springboot集成RedisTemplate发布Redis数据带有前缀乱码问题排查解决

devtools/2024/10/21 6:05:27/

先说下项目背景:

五一前冲刺新项目,项目springboot2 , 集成stomp协议 和前端进行websocket通信。  之前写过一篇文章关于stomp协议的文章,有兴趣可以看看  【JAVA技术】springboot集成stomp协议实现 用户在线离线  。

测试同学反馈,项目测试环境测试ok了,上生产环境出问题了。恰巧五一放假开发提前回家了, 我看了下,定位到问题,因为测试环境是单点, 正式环境是集群。  这时候其他同学 改用redis 发布订阅 通知所有客户端解决。

之前项目springboot集成过Jedis实现过发布订阅功能, 原以为这个过程很顺畅。昨天收到反馈, springboot集成redisTemplate发布json字符串,订阅后解析不了。 

看了下redis里的数据,发布的 json数据前面有一串乱码,导致订阅无法解析。

图片

翻看代码才发现, publish使用的RedisTempate, subscribe用的StringRedisTemplate接收, 二者不一致导致。 

原因找到了,那处理方式很简单,全部采用StringRedisTemplate 。这时候会发现 发布到redis的数据是个json数据。问题得以解决。

图片

问题虽然解决,这里分析下为啥出现这种情况。

首先, Spring Boot Data(数据) Redis 中提供了 RedisTemplate 和 StringRedisTemplate;StringRedisTemplate 是 RedisTemplate 的子类,两个方法基本一致,不同之处在于 操作的数据类型不同:RedisTemplate 两个泛型都是 Object,意味着存储的 key 和 value 都可以是一个对象。StringRedisTemplate 两个泛型都是 String,意味着存储的 的 key 和 value 都只能是字符串。

我们知道,使用 RedisTemplate 默认是将对象序列化到 Redis 中,所以 放入的对象必须实现对象序列化接口。

org.springframework.data.redis.core.RedisTemplate实例化需要序列化和反序列化组件,如果我们不指定,默认使用org.springframework.data.redis.serializer.JdkSerializationRedisSerializer进行序列化,而JdkSerializationRedisSerializer最终使用的是Java原生java.io.ObjectOutputStream.ObjectOutputStream(OutputStream)进行序列化。

这个乱码前缀就是ObjectOutputStream进行序列化时添加的。看实现源码

图片

问题解决,终于可以过一个愉快的五一了。

原文链接:【问题排查】Springboot集成RedisTemplate发布Redis数据带有前缀乱码问题排查解决


http://www.ppmy.cn/devtools/27753.html

相关文章

MyBatis(XML映射器操作)

文章目录 XML映射器操作(XxxMapper.xml)文件目录1.基本介绍1.优点2.常用顶级元素 2.环境配置1.在原来的父模块下创建一个子模块2.删除没用的两个文件夹3.创建基本目录4.父模块的pom.xml5.jdbc.properties6.mybatis-config.xml7.测试使用MonsterMapperTes…

基于python的舞蹈经验分享交流网站django+vue

1.运行环境:python3.7/python3.8。 2.IDE环境:pycharmmysql5.7/8.0; 3.数据库工具:Navicat11 4.硬件环境:windows11/10 8G内存以上 5.数据库:MySql 5.7/8.0版本; 运行成功后,在浏览器中输入&am…

【高质量】2024五一数学建模C题保奖思路+代码(后续会更新)

你的点赞收藏是我后续更新的最大动力! 一定要点击文末的卡片,那是获取资料的入口! 你是否在寻找数学建模比赛的突破点? 作为经验丰富的数学建模团队,我们将为你带来2024 年五一数学建模(C题)…

利用R语言自带函数快速探索数据

《R Graphics Cookbook》 chapter2 Quickly Exploring Data 快速浏览数据 为了非常快速地浏览数据,有时使用 R 自带的绘图函数很有用 Creating a Scatter Plot 创建一个散点图 要制作散点图,请使用 plot() 并向其传递一个 x 值的向量,后跟一…

为什么我的Mac运行速度变慢 mac运行速度慢怎么办 如何使用CleanMyMac X修复它

近些年伴随着苹果生态的蓬勃发展,越来越多的用户开始尝试接触Mac电脑。然而很多人上手Mac后会发现,它的使用逻辑与Windows存在很多不同,而且随着使用时间的增加,一些奇奇怪怪的文件也会占据有限的磁盘空间,进而影响使用…

力扣-977.有序数组的平方

class Solution:def sortedSquares(self, nums: List[int]) -> List[int]:# 使用列表推导式计算每个数字的平方,并排序后返回return sorted(num * num for num in nums)思路: 这段代码实现了一个函数 sortedSquares,它接受一个整数列表 n…

web3以太坊开发,前后端交互中涉及到的合约

在web3以太坊开发中,往往大家交流的时候,会涉及到一些合约相关的词汇,这里重点说两个合约,一个是manager合约,另一个是registry合约。 目录 1 Manager合约 2 Registry合约 2.1 Registry合约可以做什么? …

SpringMVC执行流程

SpringMVC的执行流程(介绍核心组件) SpringMVC是一个基于Java的开源Web应用程序开发框架,它遵循了MVC(Model-View-Controller)架构模式。MVC模式是一种将应用程序分为三个主要部分的设计模式,分别是模型&am…