Redis - Redis整合SpringBoot + 自定义RedisTemplate

回到顶部(go to top)

Redis整合SpringBoot

在测试中,推荐使用我们自己重写的RedisTemplate

 

 

回到顶部(go to top)

RedisTemplate 序列化问题

1.为何Redis整合Spring时需要在存储时序列化?

在JAVA中,一个对象的信息一般并非连续的,在存储的时候我们会需要提炼为一个连续的数据串(通常是byte array数组或者字符串),这个也正是序列化的字面意思。这样才能将你的对象信息存储起来,或者用于传输

任何存储都需要序列化。只不过常规你在用DB一类存储的时候,这个事情DB帮你在内部搞定了(直接把SQL带有类型的数据转换成内部序列化的格式,存储;读取时再解析出来)。

而Redis并不会帮你做这个事情。当你用Redis的key和value时,value对于redis来讲就是个byte array。你要自己负责把你的数据结构转换成byte array,等读取时再读出来。

一个特例是字符串,因为字符串自己几乎就已经是byte array了,所以不需要自己处理。

因此当你要用redis存一个东西,你可能会遇到

  • 如果是boolean类型的true/false;你要自己定义redis里怎么表示true和false。比如你可以用1代表true,0代表false;也可以用“true”这个字符串代表true,“false”这个字符串代表false。
  • 如果是数字,可以直接存储数字的字符串表示(5 --> '5'),然后读取时再把数字字符串转回来(parseInt/parseDouble/...)。
  • 如果是时间/日期,可以自己定义一种字符串表达,比如epoc timestamp这个数的字符串表示,又或者是ISO8601的格式。
  • 如果是一个复杂的数据结构,你需要自己用某种序列化格式来存,可以是json, protobuf, avro, java serialization, python pickle……

回到Spring这边。Spring的redisTemplate默认会使用java serialization做序列化。你也可以用StringRedisTemplate,那么你set的所有数据都会被toString一下再存到redis里。但这个toString不一定能反解析的回来……

总之简单一句话,你要形成一个序列化的约定,确保存进去的东西能解析回来不出错。也许你可以和你的team商量一个规范。

2.默认序列化方式:Jdk序列化(不推荐)

不建议试用默认java的对象序列化,推荐自己序列化为json后存储,否则各种兼容问题

 

3.推荐序列化方式:key使用StringRedisSerializer, value使用Jackson2JsonRedisSerializer

 

 

为什么key和value用的serializer不同?

因为我们在自定义RedisTemplate时,泛型定义为<String, Object>。

key都是String,就可以使用简单的StringRedisSerializer来做简单的序列化,反序列化即可;

而value是Object,略微复杂,仅仅靠StringRedisSerializer(--类似toString()的逻辑,序列化后不一定能反序列化成功...)是不行的。

 

 

  

4.所有pojo类都要序列化

redis储存对象,这个类需要实现序列化接口: class User implements Serializable. 或者,对象保存之前就序列化为json字符串之类的。

 

回到顶部(go to top)

RedisTemplate 模板

 

 

 

回到顶部(go to top)

RedisUtil 模板

用来封装RedisTemplate原始的,但是用起来复杂的API。封装层略微简单些的函数。

(截图未包含所有的封装API,因为太多了)

 

 

 

回到顶部(go to top)

参考文章

作者:大宽宽
链接:https://www.zhihu.com/question/277363840/answer/392945240
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

posted on   frank_cui  阅读(1404)  评论(0编辑  收藏  举报

编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

levels of contents
点击右上角即可分享
微信分享提示