RedisTemplate序列化
时间: 2023-05-29 10:07:22 浏览: 155
redisTemplate封装成redisUtils和分布式锁实现
RedisTemplate在序列化时默认使用JdkSerializationRedisSerializer,即使用Java序列化机制将对象序列化为字节流,再将字节流存储到Redis中。但是JdkSerializationRedisSerializer存在一些问题,例如序列化后的字节流过大,序列化和反序列化速度较慢,不支持跨语言等等。
因此,在实际开发中,我们可以根据需要选择其他的序列化方式。RedisTemplate支持以下几种序列化方式:
1. GenericJackson2JsonRedisSerializer:使用Jackson库将对象序列化为JSON格式的字符串,再将字符串存储到Redis中。该序列化方式支持跨语言,但是序列化后的字符串比字节流要大。
2. Jackson2JsonRedisSerializer:同上,但是只支持JSON格式的字符串序列化。
3. StringRedisSerializer:将对象序列化为字符串,再将字符串存储到Redis中。适用于存储简单的字符串类型。
4. JdkSerializationRedisSerializer:同上,使用Java序列化机制将对象序列化为字节流。
我们可以通过以下方式配置RedisTemplate的序列化方式:
```java
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory lettuceConnectionFactory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(lettuceConnectionFactory);
// 使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值
Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
// 使用StringRedisSerializer来序列化和反序列化redis的key值
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
return redisTemplate;
}
}
```
在上述代码中,我们使用Jackson2JsonRedisSerializer来序列化和反序列化Redis的value值,使用StringRedisSerializer来序列化和反序列化Redis的key值。同时,我们还通过ObjectMapper来设置了Jackson2JsonRedisSerializer的一些属性。最后,我们将配置好的序列化方式设置到RedisTemplate中。
阅读全文