hashKey-hashValue,key-value,分别对应hash结构和非hash结构的序列化机制,所以我们可以分别制定key、value的序列化机制,也可以针对hash和非hash进行区分处理。如果这些都没有指定,RedisTemplate会选择defaultSerializer的配置来进行序列化。
defaultSerializer的默认实现是JdkSerializationRedisSerializer,这种序列化的一个典型问题是,针对泛型定义的的对象,会保存成二进制格式,序列化效率上不是最差的,但是长度上会多出来尾巴,影响可读性和传输效率,就像这样的:
改进办法很简单,替换默认序列化接口实现机制,使用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;
}
现在,缓存的结果就会变成这样:
关于性能方面,感兴趣的可以自己测试下,KryoRedisSerializer的压缩率和速度最优,fastJson次之,默认的则最差。
原文:http://blog.51cto.com/10705830/2166146