StringRedisTemplate
继承自RedisTemplate,在这里说明一下,当我们使用RedisTemplate往redis中存储java对象的时候,他会顺带着将该java对象的字节码文件也同时存进了内存中,这是为了实现自动反序列化
尽管JSON的序列化方式可以满足我们的需求,但是仍然存在一些问题,如上图所示,为了在反序列化时知道对象的类型,JSON序列化器会将类的class类型写入json结果中,存入Redis,会带来额外的内存开销。
在使用RedisTemplate是一般我们都会使用自定义序列化方式来实现,比如下列配置:
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
// key 序列化方式
redisTemplate.setKeySerializer(new StringRedisSerializer());
// value 序列化
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
// hash 类型 key序列化
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
// hash 类型 value序列化方式
redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
// 注入连接工厂
redisTemplate.setConnectionFactory(redisConnectionFactory);
// 让设置生效
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
}
但是现在为了节省内存开销,我们并不会使用JSON序列化器来处理Value,而是统一使用String序列化器,要求只能存储String类型的key和value,当需要存储Java对象时,手动完成对象的序列化和反序列化
Spring默认提供了一个StringRedisTemplate类,它的key和Value的序列化方式默认就是String类型,省去了我们自定义RedisTemplate的过程
总结:RedisTemplate的两种序列化实践方案:
方案一:
-
- 自定义RedisTemplate
- 2.修改RedisTemplate的序列化器为GenericJackson2JsonRedisSerializer
方案二:
- 1.使用StringRedisTemplate
- 2.写入Redis时,手动把对象序列化为json格式字符串
- 读取Redis时,手动把读取到的JSON反序列化成对象
版权声明:本文为qq_45243783原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。