Spring Data Redis 序列化

本文探讨了SpringDataRedis中序列化的机制,包括hashKey、hashValue、key、value的序列化方式,并介绍了如何通过替换默认序列化实现,如使用Jackson2JsonRedisSerializer或KryoRedisSerializer,来提高序列化效率和压缩率。

Spring Data Redis 序列化
在Spring中使用的Redis缓存数据,可以通过RedisTemplate直接操作,也可以通过@Cacheable注解实现缓存(可参照另一篇文章的介绍:Spring Cachable Key的定义及应用)。不论使用何种方式,最终都要将key、value序列化成字节数组或者字符串保存。RedisTemplate源码中可以看出来,其序列化是通过一系列的RedisSerializer接口实现的。

Spring Data Redis 序列化

hashKey-hashValue,key-value,分别对应hash结构和非hash结构的序列化机制,所以我们可以分别制定key、value的序列化机制,也可以针对hash和非hash进行区分处理。如果这些都没有指定,RedisTemplate会选择defaultSerializer的配置来进行序列化。

defaultSerializer的默认实现是JdkSerializationRedisSerializer,这种序列化的一个典型问题是,针对泛型定义的的对象,会保存成二进制格式,序列化效率上不是最差的,但是长度上会多出来尾巴,影响可读性和传输效率,就像这样的:

Spring Data Redis 序列化

改进办法很简单,替换默认序列化接口实现机制,使用Jackson2JsonRedisSerializer,或者KryoRedisSerializer,亦或者自定义实现。下面以Jackson实现为例:

@Bean
public RedisTemplate redisTemplate(JedisConnectionFactory connectionFactory) {
RedisTemplate redisTemplate = new RedisTemplate();
redisTemplate.setConnectionFactory(connectionFactory);

    // 使用Jackson2JsonRedisSerialize 替换默认序列化
    Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);

    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
    objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
    jackson2JsonRedisSerializer.setObjectMapper(objectMapper);

    // 设置value的序列化规则和 key的序列化规则
    redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
    redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
    redisTemplate.setKeySerializer(new StringRedisSerializer());
    redisTemplate.setHashKeySerializer(redisTemplate.getKeySerializer());
    redisTemplate.afterPropertiesSet();

    return redisTemplate;

}

现在,缓存的结果就会变成这样:
Spring Data Redis 序列化

关于性能方面,感兴趣的可以自己测试下,KryoRedisSerializer的压缩率和速度最优,fastJson次之,默认的则最差。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值