1. 程式人生 > 資料庫 >RedisTemplate 序列化配置

RedisTemplate 序列化配置

分享知識 傳遞快樂

 

當我們的資料儲存到 Redis 的時候,我們的鍵(key)和值(value)都是通過 Spring 提供的 Serializer 序列化到資料庫的。

RedisTemplate 預設使用的是 JdkSerializationRedisSerializer,StringRedisTemplate 預設使用的是 StringRedisSerializer。

 

序列化的方法

  • JdkSerializationRedisSerializer:POJO物件的存取場景,使用JDK本身序列化機制,將pojo類通過ObjectInputStream/ObjectOutputStream進行序列化操作,最終redis-server中將儲存位元組序列。是目前預設的序列化策略。
  • StringRedisSerializer:Key或者value為字串的場景,根據指定的charset對資料的位元組序列編碼成string,是“new String(bytes, charset)”和“string.getBytes(charset)”的直接封裝。是最輕量級和高效的策略。
  • JacksonJsonRedisSerializer:jackson-json工具提供了javabean與json之間的轉換能力,可以將pojo例項序列化成json格式儲存在redis中,也可以將json格式的資料轉換成pojo例項。因為jackson工具在序列化和反序列化時,需要明確指定Class型別,因此此策略封裝起來稍微複雜。【需要jackson-mapper-asl工具支援】
  • GenericFastJsonRedisSerializer:另一種javabean與json之間的轉換,同時也需要指定Class型別。
  • OxmSerializer:提供了將javabean與xml之間的轉換能力,目前可用的三方支援包括jaxb,apache-xmlbeans;redis儲存的資料將是xml工具。不過使用此策略,程式設計將會有些難度,而且效率最低;不建議使用。【需要spring-oxm模組的支援】
  • FastJsonRedisSerializer:使用 Alibaba Fastjson 處理。

 

注意

使用 FastJsonRedisSerializer 配置 fastjson 存 java物件時取出來一直是 JSONObject。

解決如下:

使用 GenericFastJsonRedisSerializer 處理序列化。

 

當 Redis 的值中含有類似於 \xac\xed\x00\x05t\x00\x04 。

解決如下:

這是使用 redis 自帶的序列化方式的問題,reidstemplate 使用的預設的序列化方式有問題,需要調整序列化方式才能在 redis 中正常顯示。

 

參考程式碼如下:

@Bean
public RedisSerializer<String> redisKeySerializer() {

    return new StringRedisSerializer();
}

@Bean
public RedisSerializer<Object> redisValueSerializer() {

    return new GenericFastJsonRedisSerializer();
}


/**
 * RedisTemplate配置
 *
 * @param factory
 */
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory, RedisSerializer<String> redisKeySerializer, RedisSerializer<Object> redisValueSerializer) {
    RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
    redisTemplate.setConnectionFactory(factory);

    //設定Key的序列化採用StringRedisSerializer
    redisTemplate.setKeySerializer(redisKeySerializer);
    redisTemplate.setHashKeySerializer(redisKeySerializer);

    //設定值的序列化
    redisTemplate.setValueSerializer(redisValueSerializer);
    redisTemplate.setHashValueSerializer(redisValueSerializer);

    redisTemplate.afterPropertiesSet();

    return redisTemplate;
}

 

 

 

 

 

 

 

 

 

———————————

如有不足請留言指正
相互學習,共同進步