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;
    }
}
posted @ 2022-12-21 13:47  凡223  阅读(112)  评论(0编辑  收藏  举报