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

先说下项目背景:

五一前冲刺新项目,项目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数据带有前缀乱码问题排查解决

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值