StringRedisTemplate和RedisTemplate的区别
springboot提供了两种redis访问工具类StringRedisTemplate和RedisTemplate,为什么spring官方会提供两种不同redis访问工具呢?两者主要的的区别在于redis的key和value的序列化方式不同,并且StringRedisTemplate继承RedisTemplate并修改其序列化方式。
RedisTemplate默认使用JdkSerializationRedisSerializer序列化对象,序列化成byte[]
StringRedisTemplate默认使用StringRedisSerializer序列化对象,序列化成String
Spring提供了几种redis序列化方式有:
- GenericToStringSerializer: 可以将任何对象泛化为字符串并序列化
- Jackson2JsonRedisSerializer: 跟JacksonJsonRedisSerializer实际上是一样的
- JacksonJsonRedisSerializer: 序列化object对象为json字符串
- JdkSerializationRedisSerializer: 序列化java对象
- StringRedisSerializer: 简单的字符串序列化
性能比较
- JdkSerializationRedisSerializer序列化后长度最小,Jackson2JsonRedisSerializer效率最高。
- 如果综合考虑效率和可读性,牺牲部分空间,推荐key使用StringRedisSerializer,保持的key简明易读;value可以使用Jackson2JsonRedisSerializer
- 如果空间比较敏感,效率要求不高,推荐key使用StringRedisSerializer,保持的key简明易读;value可以使用JdkSerializationRedisSerializer
一、StringRedisTemplate
StringRedisTemplate主要用于存储字符串,会redis的key和value都序列化成String字符串存储到redis中。
二、RedisTemplate
RedisTemplate可以存储对象,默认使用JdkSerializationRedisSerializer序列化对象,序列化成byte[],导致数据没有可读性。
可以看出,在redis查询工具里是16进制数据或者是乱码的无法查看。
三、自定义序列化
针对RedisTemplate进行自定义序列化规则,redis中key使用StringRedisSerializer进行序列化、value则使用FastJsonRedisSerializer进行序列化。
@Configuration
public class RedisConfig {@Bean(name = "redisTemplate")public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory redisConnectionFactory) {RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();redisTemplate.setConnectionFactory(redisConnectionFactory);FastJsonRedisSerializer<Object> fastJsonRedisSerializer = new FastJsonRedisSerializer<>(Object.class);// 建议使用这种方式,小范围指定白名单ParserConfig.getGlobalInstance().addAccept("com.xxxxx.");// 设置键(key)的序列化采用StringRedisSerializer。redisTemplate.setKeySerializer(new org.springframework.data.redis.serializer.StringRedisSerializer());redisTemplate.setHashKeySerializer(new org.springframework.data.redis.serializer.StringRedisSerializer());// 设置值(value)的序列化采用FastJsonRedisSerializer。redisTemplate.setValueSerializer(fastJsonRedisSerializer);redisTemplate.setHashValueSerializer(fastJsonRedisSerializer);return redisTemplate;}
}
注意:在存储字符串的时候,StringRedisSerializer则会默认去掉字符串两边的引号,而FastJsonRedisSerializer则两遍引号不会去掉。
如下所示
redisTemplate.opsForSet().add("ownStringRedisSerializer","234234234");
stringRedisTemplate.opsForSet().add("ownStringRedisSerializer","23423");