Redis 序列化规则及重定义
1. JdkSerializationRedisSerializer
RestTemplate 默认的序列化方式,当存储时 Key 会变成一串字符串
- 优点
反序列化时不需要提供类型信息(class), - 缺点
- 需要实现Serializable接口
- 存储的为二进制数据
- 序列化后的结果非常庞大,是JSON格式的5倍左右,这样就会消耗redis服务器的大量内存
2. StringRedisSerializer
StringRedisTemplate 默认的序列化方式,key 和 Value 都会采用此方式进行序列化,是被推荐使用的,对开发者友好,轻量级,效率也比较高
3. GenericToStringSerializer
需要调用者给传一个对象到字符串互转的 Converter
4. Jackson2JsonRedisSerializer
- 优点
速度快,序列化后的字符串短小精悍,不需要实现 Serializable 接口 - 缺点
此类的构造函数中有一个类型参数,必须提供要序列化对象的类型信息(.class对象),其在反序列化过程中用到了类型信息
一般传入的都是 Object.class
类型。假如存储的是带泛型的 List 对象,序列化带泛型的数据时,会以 Map 的结构进行存储;进行反序列化时不能将 Map 解析成对象,从 Redis 获取的值为 LinkedHashMap 类型,此时进行转换的话会报错(可以使用 GenericJackson2JsonRedisSerializer 解决这个问题)
RedisTemplate 的 Key 序列化规则为 StringRedisSerializer,Value 的序列化规则为 Jackson2JsonRedisSerializer
@Configuration
public class RedisConfig {
@Bean
RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate redisTemplate = new RedisTemplate();
redisTemplate.setConnectionFactory(redisConnectionFactory);
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
redisTemplate.setDefaultSerializer(jackson2JsonRedisSerializer);
redisTemplate.setKeySerializer(stringRedisSerializer);
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.setHashKeySerializer(stringRedisSerializer);
redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
return redisTemplate;
}
}
5. GenericJackson2JsonRedisSerializer
与 Jackson2JsonRedisSerializer 大致相同,但会额外存储序列化对象的包命和类名,反序列化时以这个作为标识就可以反序列化成指定的对象
RedisTemplate 的 Key 序列化规则为 StringRedisSerializer,Value 的序列化规则为 GenericJackson2JsonRedisSerializer
@Configuration
public class RedisConfig {
@Bean
RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate redisTemplate = new RedisTemplate();
redisTemplate.setConnectionFactory(redisConnectionFactory);
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
// 配置序列化
redisTemplate.setDefaultSerializer(genericJackson2JsonRedisSerializer);
redisTemplate.setKeySerializer(stringRedisSerializer);
redisTemplate.setValueSerializer(genericJackson2JsonRedisSerializer);
redisTemplate.setHashKeySerializer(stringRedisSerializer);
redisTemplate.setHashValueSerializer(genericJackson2JsonRedisSerializer);
return redisTemplate;
}
}