StringRedisTemplate

StringRedisTemplate继承自RedisTemplate,在这里说明一下,当我们使用RedisTemplate往redis中存储java对象的时候,他会顺带着将该java对象的字节码文件也同时存进了内存中,这是为了实现自动反序列化
StringRedisTemplate_第1张图片
尽管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对象时,手动完成对象的序列化和反序列化

StringRedisTemplate_第2张图片
Spring默认提供了一个StringRedisTemplate类,它的key和Value的序列化方式默认就是String类型,省去了我们自定义RedisTemplate的过程

StringRedisTemplate_第3张图片

总结:RedisTemplate的两种序列化实践方案:

方案一:

    1. 自定义RedisTemplate
  • 2.修改RedisTemplate的序列化器为GenericJackson2JsonRedisSerializer

方案二:

  • 1.使用StringRedisTemplate
  • 2.写入Redis时,手动把对象序列化为json格式字符串
  • 读取Redis时,手动把读取到的JSON反序列化成对象

你可能感兴趣的:(redis,redis)