大家好,我是烤鸭:

​     今天分享一个redisTemplate 使用时,value 序列化的问题。

1.  问题描述

其实我最开始遇到的问题是:

stringRedisTemplate.opsForSet().isMember(key,value)一直返回false问题,下边博客给出了答案

https://blog.csdn.net/weixin_39523456/article/details/108236181

改完之后又出现了新问题,没办法就跟着看了下源码。

发现是value在不同的序列化方式下的问题?

2. 情景复现及源码

用的value的序列化方式是:GenericJackson2JsonRedisSerializer

这个是 测试的代码,返回的结果 Long类型的true , String 类型的 false

但是我们通过控制台看一下呢,感觉也没啥区别啊,返回的都是 1

这时候我想看一下redis服务端接收到命令到底是啥,为啥返回结果不同。由于客户端这边写入的字节数据(也就是下边的write方法),没办法看,只能从服务端想办法。

服务端通过monitor 命令开启执行过的命令,由于是监控当前节点的。如果是集群模式,必须每个节点单独开启(数据在哪台,就开哪台)。

  ./redis-cli -h 127.0.0.1 -p 6001monitor 

这下捕捉到了服务端接收的指令。

这下明白了,如果是String 类型的,使用 GenericJackson2JsonRedisSerializer 序列化方式,会在外侧被加上一个转义双引号 ""

通过控制台查看的结果是这样的。

3. 关于最开始的问题和解决方案

上面的博客解决方案不适用于我,项目里redis已经在别的地方使用过,改了一下序列化方式,发现会影响之前的方法,因为原有的数据是通过 GenericJackson2JsonRedisSerializer  的序列化方式写入的,当使用 StringRedisSerializer 会出现下面的问题,又多了双引号...其实不是多了双引号,是本来就是这种结构,只是用 GenericJackson2JsonRedisSerializer  反序列化的时候会只保留一个 "",变成String类型。

这个跟哪种序列化的方式没关系,是哪种存的,取的时候就用哪种。不要随意修改序列化方式!!!

4.  最终的解决方案

既然不能改序列化方式,又对存入的数据结构没什么把握,建议做两手准备...

RedisTemplate value序列化导致的问题相关推荐

  1. fastjson带泛型序列化导致内存泄漏

    fastjson带泛型序列化导致内存泄漏 一.背景 某日早上,生产环境告警群出现了大量响应时间在1s多的慢接口,在应用日志中也能找到不少接口超时熔断(响应时间>=5s). 当中有不少接口的SQL ...

  2. JSON序列化导致Long类型被搞成Integer经典巨坑

    一.背景 最近遇到一个错误,就是某个字段肯定是Long类型的,通过Map<String,Object>方式转成JSON字符串,然后存到了DB的某个字段里. 为了Json存储字,然后反序列化 ...

  3. Redis序列化、RedisTemplate序列化方式大解读,介绍Genericjackson2jsonredisserializer序列化器的坑

    前言 上一篇已经介绍了优雅的操作Redis: [小家Spring]Spring Boot中使用RedisTemplate优雅的操作Redis,并且解决RedisTemplate泛型注入的问题.本篇着重 ...

  4. springboot系列——redisTemplate和stringRedisTemplate对比、redisTemplate几种序列化方式比较

    文章目录 一.redisTemplate和stringRedisTemplate对比 1.StringRedisTemplate 2.RedisTemplate 二.redisTemplate序列化方 ...

  5. Springboot下RedisTemplate的两种序列化方式

    一.定义一个配置类,自定义RedisTemplate的序列化方式 @Configuration public class RedisConfig {@Beanpublic RedisTemplate& ...

  6. 自定义redisTemplate序列化配置

    使用spring-boot-starter-data-redis来操作redis时,自定义RedisTemplate类. package com.hmdp.config;import com.fast ...

  7. redis序列化_SpringBoot整合redis

    redis是最常用的缓存数据库,常用于存储用户登录token.临时数据.定时相关数据等. redis是单线程的,所以redis的操作是原子性的,这样可以保证不会出现并发问题. redis基于内存,速度 ...

  8. RedisTemplate和StringRedisTemplate的区别

    RedisTemplate和StringRedisTemplate的区别: 两者的关系是StringRedisTemplate继承RedisTemplate. 两者的数据是不共通的:也就是说Strin ...

  9. Redis:redis通用命令;redis常见数据结构;redis客户端;redis的序列化

    一.redis命令 1.redis通用命令 Redis 通用命令是一些 Redis 下可以作用在常用数据结构上的常用命令和一些基础的命令 常见的命令有: keys 查看符合模板的所有key,不建议在生 ...

最新文章

  1. matlab和python哪个运行快_MATLAB比Python更快吗?
  2. sqlserver 更新 datetime 数据_获取股票分笔数据存储本地
  3. 【百家稷学】深度学习与计算机视觉核心理论与实践(中国地质大学实训)
  4. JavaScript实现heapsort堆排序算法(附完整源码)
  5. 人心散了、项目必然要败
  6. 负数在计算机中如何表示?
  7. 爬虫演练-动态的抓取cp网站数据的演练-注意要反爬
  8. 新松机器人产业小镇_机器人行业迎来拐点,新松机器人如何“过冬”?丨亿欧读财报...
  9. 锐捷交换机配置保存到计算机,锐捷交换机配置命令总结中篇
  10. 富士通服务器操作系统安装,U盘为富士通LIFEBOOK SH760笔记本安装原版win7系统教程...
  11. 基于51单片机的DHT11传感器
  12. drive翻译成中文_drive是什么意思_drive翻译_读音_用法_翻译
  13. 宝塔面板搭建WordPress网站完整教程
  14. IOS swift开发——获取设备定位信息
  15. 使用python爬取图书封面
  16. 前端学到什么程度才能叫精通?
  17. maven安装测试报JAVA_HOME路径安装错误
  18. 没有购买域名和服务器,怎么搭建网站?(一)
  19. 直坐标机械手的优缺点都有哪些?
  20. 学习ES6 The Dope Way Part I:const,let&var

热门文章

  1. 前端学习(2940):vue作为组件的注意事项
  2. [css] 请说说在什么时候用transition?什么时候使用animation?
  3. 前端学习(2595):后台系统的权限控制和管理--动态路由
  4. 前端学习(1419):ajax请求参数传递
  5. 前端学习(751):Javascript作用域
  6. 前端学习(94):css重置样式
  7. 第三十一期:大数据分析师学习入门,10个数据可视化技巧
  8. java学习(21):移位运算符
  9. setInterval 和setTimeout 清空定时器,返回值,赋值为null的区别
  10. iOS新版微信底部返回横条问题