使用Spring 提供的 Spring Data Redis 操作redis 必然要使用Spring提供的模板类 RedisTemplate, 今天我们好好的看看这个模板类 。

看看4个序列化相关的属性 ,主要是 用于 KEY 和 VALUE 的序列化 。 举个例子,比如说我们经常会将POJO 对象存储到 Redis 中,一般情况下会使用 JSON 方式序列化成字符串,存储到 Redis 中 。
Spring提供的Redis数据结构的操作类
再看个常用的 StringRedisTemplate
RedisTemplate<K, V> 支持泛型,StringRedisTemplate K V 均为String类型。
org.springframework.data.redis.core.StringRedisTemplate 继承 RedisTemplate 类,使用 org.springframework.data.redis.serializer.StringRedisSerializer 字符串序列化方式。

RedisSerializer接口 是 Redis 序列化接口,用于 Redis KEY 和 VALUE 的序列化

RedisSerializer 接口的实现类 如下

归类一下
org.springframework.data.redis.serializer.JdkSerializationRedisSerializer ,默认情况下,RedisTemplate 使用该数据列化方式。
我们来看下源码 RedisTemplate#afterPropertiesSet()
Spring Boot 自动化配置 RedisTemplate Bean 对象时,就未设置默认的序列化方式。
绝大多数情况下,不推荐使用 JdkSerializationRedisSerializer 进行序列化。主要是不方便人工排查数据。
我们来做个测试

运行单元测试


看不懂呀 ,老哥
KEY 前面带着奇怪的 16 进制字符 , VALUE 也是一串奇怪的 16 进制字符 。。。。。
为什么是这样一串奇怪的 16 进制? ObjectOutputStream#writeString(String str, boolean unshared) 实际就是标志位 + 字符串长度 + 字符串内容
KEY 被序列化成这样,线上通过 KEY 去查询对应的 VALUE非常不方便,所以 KEY 肯定是不能被这样序列化的。
VALUE 被序列化成这样,除了阅读可能困难一点,不支持跨语言外,实际上也没还OK。不过,实际线上场景,还是使用 JSON 序列化居多。
org.springframework.data.redis.serializer.StringRedisSerializer ,字符串和二进制数组的直接转换

绝大多数情况下,我们 KEY 和 VALUE 都会使用这种序列化方案。
org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer 使用 Jackson 实现 JSON 的序列化方式,并且从 Generic 单词可以看出,是支持所有类。

先说个结论
标准JSON

是不是多了@class 属性,反序列化的对象的类型就可以从这里获取到。
@class 属性看似完美解决了反序列化后的对象类型,但是带来 JSON 字符串占用变大,所以实际项目中,我们很少采用 Jackson2JsonRedisSerializer
org.springframework.data.redis.serializer.OxmSerializer使用 Spring OXM 实现将对象和 String 的转换,从而 String 和二进制数组的转换。 没见过哪个项目用过,不啰嗦了
到此这篇关于深入理解 Redis Template及4种序列化方式的文章就介绍到这了,更多相关Redis Template序列化内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!