06. SDR 序列化方式-Serializer

SDR 的序列化是spring data redis 框架中一個非常重要的核心概念, 只有理解了SDR 的序列化,才能搞清楚RedisTemplate 的機制, 才能搞清楚RedisTemplate 和 StringRedisTemplate 之間的區別. Redis

1. SDR 的序列化

1.1 什麼是序列化

對於數據,在Redis中的存儲形式爲字節, 但是在java 語言中可以是基礎類型或自定義類型, 如String, Integer, Object 等. SDR 中將用戶類型與字節之間的轉換稱爲SDR 的序列化和反序列化。

1.2 序列化方式

SDR 默認提供了三種序列化方式, 可以通過RedisSerializer 接口獲取.

  • JdkSerializationRedisSerializer: jdk 序列化方式, 默認的序列化方式
  • GenericJackson2JsonRedisSerializer: json 序列化方式, 使用的時jackson 解析json
  • StringRedisSerializer: string 序列化方式
// 獲取jdk 序列化方式
RedisSerializer serializer = RedisSerializer.java();

// 獲取string 序列化方式
RedisSerializer serializer = RedisSerializer.string();

// 獲取json 序列化方式
RedisSerializer serializer = RedisSerializer.json();

1.3 序列化方式選擇推薦

  • key 的序列化: 筆者推薦使用String 序列化方式,或自定義String 序列化方式, 存儲格式如: order:0:1001
  • value的序列化: 筆者推薦使用json 序列化方式, 可使用默認提供的Jackson序列化方式 或Fastjson 提供的fastjson序列化方式, 或自定義壓縮序列化json方式

2. 自定義序列化方式

自定義序列化方式只需要實現RedisSerializer接口, 並實現序列化和反序列化方法即可.

2.1 創建序列化接口實現類

public class MySerializer implements RedisSerializer {

    // 序列化, 將用戶類型序列化成字節數組
    @Override
    public byte[] serialize(Object o) throws SerializationException {
        return null;
    }

    // 反序列化, 將字節數組反序列化爲用戶類型
    @Override
    public Object deserialize(byte[] bytes) throws SerializationException {
        return null;
    }
}

2.2 註冊RedisTemplate 實例

需要向spring容器中註冊一個新的RedisTemplate 實例,並設置序列化方式。需要注意的時,需要設置四個地方。

@Bean("myRedisTemplate")
public RedisTemplate<Object, Object> mySerializer(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
    RedisTemplate<Object,Object> template = new RedisTemplate<>();
    template.setConnectionFactory(redisConnectionFactory);
    template.setKeySerializer(new StringRedisSerializer());
    template.setHashKeySerializer(new StringRedisSerializer());
    template.setValueSerializer(new MySerializer());
    template.setHashValueSerializer(new MySerializer());
    return template;
}

2.3 使用自定義RedisTemplate

自動注入RedisTemplate時, 名稱要對應上.

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