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次之,默認的則最差。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章