Springboot下RedisTemplate的两种序列化方式实例详解

 更新时间:2022年09月22日 09:44:57   作者:爱吃辣的People  
这篇文章主要介绍了Springboot下RedisTemplate的两种序列化方式,通过定义一个配置类,自定义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反序列化为对象

到此这篇关于Springboot下RedisTemplate的两种序列化方式的文章就介绍到这了,更多相关Springboot RedisTemplate序列化内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • IntelliJ IDEA 2020.1 EAP4 发布,重命名/更改签名新功能一览

    IntelliJ IDEA 2020.1 EAP4 发布,重命名/更改签名新功能一览

    这篇文章主要介绍了IntelliJ IDEA 2020.1 EAP4 发布,重命名/更改签名新功能,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-04-04
  • SpringBoot手写自定义starter源码

    SpringBoot手写自定义starter源码

    这篇文章主要介绍了SpringBoot手写自定义starter源码,SpringBoot拥有很多方便使用的starter,比如spring-boot-starter-log4j、mybatis-spring-boot-starter.jar等,各自都代表了一个相对完整的功能模块,需要的朋友可以参考下
    2023-10-10
  • java 数值类型分秒时间格式化的实例代码

    java 数值类型分秒时间格式化的实例代码

    这篇文章主要介绍了java 数值类型分秒时间格式化的实例代码的相关资料,将秒或分钟的值转换为xx天xx小时xx分钟xx秒 如果 “xx” 为0 自动缺省,需要的朋友可以参考下
    2017-07-07
  • SpringBoot整合七牛云上传图片的示例代码

    SpringBoot整合七牛云上传图片的示例代码

    本文就来介绍了SpringBoot整合七牛云上传图片的示例代码,用户在前端上传图片后,交由后端处理,上传至七牛云,感兴趣的可以了解一下
    2023-10-10
  • Java源码分析:Guava之不可变集合ImmutableMap的源码分析

    Java源码分析:Guava之不可变集合ImmutableMap的源码分析

    今天给大家带来的是关于Java源码的相关知识,文章围绕着Java ImmutableMap展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下,希望能给你带来帮助
    2021-06-06
  • java LinkedList的实例详解

    java LinkedList的实例详解

    这篇文章主要介绍了java LinkedList的实例详解的相关资料,通过本文希望大家能彻底了解掌握这部分内容,需要的朋友可以参考下
    2017-09-09
  • Java多线程之Disruptor入门

    Java多线程之Disruptor入门

    这篇文章主要介绍了Java多线程之Disruptor入门,文中有非常详细的代码示例,对正在学习java多线程的小伙伴们有非常好的帮助,需要的朋友可以参考下
    2021-04-04
  • Java SE求解汉诺塔问题的示例代码

    Java SE求解汉诺塔问题的示例代码

    汉诺塔问题是一个经典的问题。汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说。本文将用Java SE求解这一问题,感兴趣的可以学习一下
    2022-03-03
  • Java 简化正则表达式的使用

    Java 简化正则表达式的使用

    本篇文章主要介绍了Java 简化正则表达式使用的相关知识,具有很好的参考价值。下面跟着小编一起来看下吧
    2017-04-04
  • Mybatis不启动项目直接测试Mapper的实现方法

    Mybatis不启动项目直接测试Mapper的实现方法

    在项目开发中,测试单个Mybatis Mapper方法通常需要启动整个SpringBoot项目,消耗大量时间,本文介绍通过Main方法和Mybatis配置类,快速测试Mapper功能,无需启动整个项目,这方法使用AnnotationConfigApplicationContext容器
    2024-09-09

最新评论