• Springboot下RedisTemplate的两种序列化方式


    一、定义一个配置类,自定义RedisTemplate的序列化方式

    @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();
            StringRedisSerializer stringRedisSerializer =
                    new StringRedisSerializer();
            // 设置Key的序列化
            template.setKeySerializer(stringRedisSerializer);
            template.setHashKeySerializer(stringRedisSerializer);
            // 设置Value的序列化
            template.setValueSerializer(jsonRedisSerializer);
            template.setHashValueSerializer(jsonRedisSerializer);
            // 返回
            return template;
        }
    }
    

    测试类进行测试

    @SpringBootTest
    class RedisDemoApplicationTests {
    
        @Autowired
        private RedisTemplate<String, Object> redisTemplate;
    
        @Test
        void testString() {
            // 写入一条String数据
            redisTemplate.opsForValue().set("name", "虎哥");
            // 获取string数据
            Object name = redisTemplate.opsForValue().get("name");
            System.out.println("name = " + name);
        }
    
        @Test
        void testObject() {
            User user = new User();
            user.setName("何雨泊");
            user.setTel(110);
            redisTemplate.opsForValue().set("user",user);
            System.out.println("name = " + user);
        }
    }
    

    测试存入字符串

    在这里插入图片描述

    测试存入对象

    对象类:
    在这里插入图片描述
    测试结果如下,能将Java对象自动的序列化为JSON字符串,并且查询时能自动把JSON反序列化为Java对象。
    不过,其中记录了序列化时对应的class名称,目的是为了查询时实现自动反序列化。这会带来额外的内存开销。
    在这里插入图片描述

    二、继续优化

    这个问题的解决我们可以采用手动序列化的方式,换句话说,就是不借助默认的序列化器,而是我们自己来控制序列化的动作,同时,我们只采用String的序列化器,这样,在存储value时,我们就不需要在内存中就不用多存储数据,从而节约我们的内存空间。
    在这里插入图片描述这种用法比较普遍,因此SpringDataRedis就提供了RedisTemplate的子类:StringRedisTemplate,它的key和value的序列化方式默认就是String方式。省去了我们自定义RedisTemplate的序列化方式的步骤,而是直接使用:

    @SpringBootTest
    public class RedisStringTests {
        @Autowired
        private StringRedisTemplate stringRedisTemplate;
    
        @Test
        void testString() {
            // 写入一条String数据
            stringRedisTemplate.opsForValue().set("stringRedisTemplate:name", "虎哥");
            // 获取string数据
            Object name = stringRedisTemplate.opsForValue().get("name");
            System.out.println("name = " + name);
        }
    	/*
    	*手动进行序列化,比较麻烦
    	*/
        @Test
        void testObject() throws JsonProcessingException{
            // 创建
            ObjectMapper mapper = new ObjectMapper();
    
            User user = new User();
            user.setName("何雨泊");
            user.setTel(110);
            // 手动序列化
            String json = mapper.writeValueAsString(user);
            stringRedisTemplate.opsForValue().set("stringRedisTemplate:user",json);
    
            String string = stringRedisTemplate.opsForValue().get("stringRedisTemplate:user");
            // 手动反序列化
            User user1 = mapper.readValue(string, User.class);
            System.out.println("name = " + user1);
        }
    	/*
        * 利用hutool库内的JSONUtil工具类,省去手动序列化,库的依赖在下面
        * */
        @Test
        void testObject1() {
            User user = new User();
            user.setName("何雨泊");
            user.setTel(110);
            /*利用hutool库内的JSONUtil进行自动序列化,将user转json*/
            stringRedisTemplate.opsForValue().set("user", JSONUtil.toJsonStr(user));
            String userjson = stringRedisTemplate.opsForValue().get("user");
            /*将json转为bean对象*/
            User user1 = JSONUtil.toBean(userjson, User.class);
            System.out.println("name = " + user1);
        }
    }
    

    hutool库的依赖

            <!--hutool-->
            <dependency>
                <groupId>cn.hutool</groupId>
                <artifactId>hutool-all</artifactId>
                <version>5.7.17</version>
            </dependency>
    

    测试结果:
    在这里插入图片描述

    三、总结

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

    • 方案一(存在一定问题):

      • 自定义RedisTemplate
      • 修改RedisTemplate的序列化器为GenericJackson2JsonRedisSerializer
    • 方案二(对方案一进行优化):

      • 使用StringRedisTemplate
      • 写入Redis时,手动把对象序列化为JSON 或者 使用工具类JSONUtil进行序列化(推荐)
      • 读取Redis时,手动把读取到的JSON反序列化为对象
  • 相关阅读:
    202206-3 CCF 角色授权 (运用stl容器模拟 + 优化 满分题解)
    【押题】24考研押题
    【PAT乙级】一百一十道真题刷后大汇总——C/C++
    【SQLServer】并行的保留线程和已使用线程
    机器学习和深度学习区别
    【语音识别入门】概述
    NIFI集群_队列Queue中数据无法清空_清除队列数据报错_无法删除queue_解决_集群中机器交替重启删除---大数据之Nifi工作笔记0061
    srpingboot security demo
    Redis知识点总结-钊兵的笔记
    开源贴片机OpenPnp使用体验
  • 原文地址:https://blog.csdn.net/weixin_42949480/article/details/126952235