SpringDataRedis序列化的一些问题[通俗易懂]

SpringDataRedis序列化的一些问题[通俗易懂]SpringDataRedis的序列化的一些问题 RedisTemplate可以接收任意Object作为值写入Redis,但是如果不实现设置序列化器的化默认是采用JDK序列化,序列化后的结果可读性差并

SpringDataRedis序列化的一些问题

SpringDataRedis的序列化的一些问题

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

SpringDataRedis序列化的一些问题[通俗易懂]

自定义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,会带来额外的内存开销,如下图所示。

SpringDataRedis序列化的一些问题[通俗易懂]

手动序列化,节省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);
	}
}

结果如下:

SpringDataRedis序列化的一些问题[通俗易懂]

原文地址:https://www.cnblogs.com/xuzhuo123/archive/2022/05/18/16286106.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/5235.html

(0)
上一篇 2023-05-17
下一篇 2023-05-18

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注