天天看點

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;
}