Spring Data Redis 序列化
阿新 • • 發佈:2018-08-29
mar ext 速度 亦或 access 序列化機制 png 現在 圖片 在Spring中使用的Redis緩存數據,可以通過RedisTemplate直接操作,也可以通過@Cacheable註解實現緩存(可參照另一篇文章的介紹:Spring Cachable Key的定義及應用)。不論使用何種方式,最終都要將key、value序列化成字節數組或者字符串保存。RedisTemplate源碼中可以看出來,其序列化是通過一系列的RedisSerializer接口實現的。
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次之,默認的則最差。
Spring Data Redis 序列化