博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
RedisTemplate value序列化导致的问题
阅读量:2061 次
发布时间:2019-04-29

本文共 989 字,大约阅读时间需要 3 分钟。

大家好,我是烤鸭:

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

1.  问题描述

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

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

   

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

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

   

2. 情景复现及源码

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

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

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

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

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

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

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

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

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

   

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

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

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

4.  最终的解决方案

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

 

转载地址:http://gymlf.baihongyu.com/

你可能感兴趣的文章
Java Guava中的函数式编程讲解
查看>>
Eclipse Memory Analyzer 使用技巧
查看>>
tomcat连接超时
查看>>
谈谈编程思想
查看>>
iOS MapKit导航及地理转码辅助类
查看>>
检测iOS的网络可用性并打开网络设置
查看>>
简单封装FMDB操作sqlite的模板
查看>>
iOS开发中Instruments的用法
查看>>
iOS常用宏定义
查看>>
被废弃的dispatch_get_current_queue
查看>>
什么是ActiveRecord
查看>>
有道词典for mac在Mac OS X 10.9不能取词
查看>>
关于“团队建设”的反思
查看>>
利用jekyll在github中搭建博客
查看>>
Windows7中IIS简单安装与配置(详细图解)
查看>>
linux基本命令
查看>>
BlockQueue 生产消费 不需要判断阻塞唤醒条件
查看>>
ExecutorService 线程池 newFixedThreadPool newSingleThreadExecutor newCachedThreadPool
查看>>
强引用 软引用 弱引用 虚引用
查看>>
数据类型 java转换
查看>>