分享知識 傳遞快樂
當我們的資料存儲到 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;
}