RedisTemplate 序列化配置
阿新 • • 發佈:2020-12-27
分享知識 傳遞快樂
當我們的資料儲存到 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;
}
———————————
如有不足請留言指正
相互學習,共同進步