SpringDataRedis序列化的一些问题

打印 上一主题 下一主题

主题 534|帖子 534|积分 1602

SpringDataRedis的序列化的一些问题

RedisTemplate可以接收任意Object作为值写入Redis,但是如果不实现设置序列化器的化默认是采用JDK序列化,序列化后的结果可读性差并且内存占用空间大,如下图。

自定义RedisTemplate的序列化方式

key和 hashKey采用 string序列化,value和HashValue采用JSON序列化
  1. @Configuration
  2. public class RedisConfig {
  3.     @Bean
  4.     public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory){
  5.         //创建RedisTemplate对象
  6.         RedisTemplate<String, Object> template = new RedisTemplate<>();
  7.         //设置连接工厂
  8.         template.setConnectionFactory(connectionFactory);
  9.         //创建JSON序列化工具
  10.         GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
  11.         //设置key和HashKey的序列化
  12.         template.setKeySerializer(RedisSerializer.string());
  13.         template.setHashKeySerializer(RedisSerializer.string());
  14.         //设置value和HashValue的序列化
  15.         template.setValueSerializer(jsonRedisSerializer);
  16.         template.setHashValueSerializer(jsonRedisSerializer);
  17.         //返回
  18.         return template;
  19.     }
  20. }
复制代码
但是JSON序列化仍存在着一些问题。为了在反序列化时知道对象的类型,JSON序列化器会将类的class类型写入json结果中,存入Redis,会带来额外的内存开销,如下图所示。

手动序列化,节省Redis内存开销

为了节省内存空间,我们不使用JSON序列化器来处理value,而使用String序列化器,要求只能存储String类型的key和value。当需要存储Java对象时,手动完成对象的序列化和反序列化。
Spring提供了StringRedisTemplate类,它的key和value的序列化方式默认就是String方式。
  1. class RedisStringTests {
  2.     @Autowired
  3.     private StringRedisTemplate stringRedisTemplate;
  4.    
  5.     @Test
  6.     void testSaveUser() throws JsonProcessingException {
  7.         //创建对象
  8.         User user = new User("虎哥", 21);
  9.         //手动序列化
  10.         String json = mapper.writeValueAsString(user);
  11.         //写入数据
  12.         stringRedisTemplate.opsForValue().set("user:200", json);
  13.         //获取数据
  14.         String jsonUser = stringRedisTemplate.opsForValue().get("user:200");
  15.         //手动反序列化
  16.         User user1 = mapper.readValue(jsonUser, User.class);
  17.         System.out.println("user1 = " + user1);
  18.         }
  19. }
复制代码
结果如下:


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

光之使者

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表