光之使者 发表于 2022-6-23 18:13:17

SpringDataRedis序列化的一些问题

SpringDataRedis的序列化的一些问题

RedisTemplate可以接收任意Object作为值写入Redis,但是如果不实现设置序列化器的化默认是采用JDK序列化,序列化后的结果可读性差并且内存占用空间大,如下图。
https://img2022.cnblogs.com/blog/2157285/202205/2157285-20220518195706392-1385281198.png
自定义RedisTemplate的序列化方式

key和 hashKey采用 string序列化,value和HashValue采用JSON序列化
@Configuration
public class RedisConfig {

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory){
      //创建RedisTemplate对象
      RedisTemplate<String, Object> template = new RedisTemplate<>();
      //设置连接工厂
      template.setConnectionFactory(connectionFactory);
      //创建JSON序列化工具
      GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
      //设置key和HashKey的序列化
      template.setKeySerializer(RedisSerializer.string());
      template.setHashKeySerializer(RedisSerializer.string());
      //设置value和HashValue的序列化
      template.setValueSerializer(jsonRedisSerializer);
      template.setHashValueSerializer(jsonRedisSerializer);
      //返回
      return template;
    }
}但是JSON序列化仍存在着一些问题。为了在反序列化时知道对象的类型,JSON序列化器会将类的class类型写入json结果中,存入Redis,会带来额外的内存开销,如下图所示。
https://img2022.cnblogs.com/blog/2157285/202205/2157285-20220518195716997-1822180457.png
手动序列化,节省Redis内存开销

为了节省内存空间,我们不使用JSON序列化器来处理value,而使用String序列化器,要求只能存储String类型的key和value。当需要存储Java对象时,手动完成对象的序列化和反序列化。
Spring提供了StringRedisTemplate类,它的key和value的序列化方式默认就是String方式。
class RedisStringTests {
    @Autowired
    private StringRedisTemplate stringRedisTemplate;
   
    @Test
    void testSaveUser() throws JsonProcessingException {
      //创建对象
      User user = new User("虎哥", 21);
      //手动序列化
      String json = mapper.writeValueAsString(user);
      //写入数据
      stringRedisTemplate.opsForValue().set("user:200", json);
      //获取数据
      String jsonUser = stringRedisTemplate.opsForValue().get("user:200");
      //手动反序列化
      User user1 = mapper.readValue(jsonUser, User.class);

      System.out.println("user1 = " + user1);
        }
}结果如下:
https://img2022.cnblogs.com/blog/2157285/202205/2157285-20220518195726118-1783200821.png

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: SpringDataRedis序列化的一些问题