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;