Redis 序列化规则及重定义


title: Redis 序列化规则及重定义
date: 2022-05-04 06:56:01
tags:

  • Redis
    categories:
  • Redis
    cover: https://cover.png
    feature: false

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;
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fan 

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值