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

作者:爱吃辣的People 时间:2021-09-11 11:48:47 

一、定义一个配置类,自定义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);
   }
}

测试存入字符串

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

测试存入对象

对象类:

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

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

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

二、继续优化

这个问题的解决我们可以采用手动序列化的方式,换句话说,就是不借助默认的序列化器,而是我们自己来控制序列化的动作,同时,我们只采用String的序列化器,这样,在存储value时,我们就不需要在内存中就不用多存储数据,从而节约我们的内存空间。

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

这种用法比较普遍,因此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>

测试结果:

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

三、总结

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

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

  • 自定义RedisTemplate

  • 修改RedisTemplate的序列化器为GenericJackson2JsonRedisSerializer

  • 方案二(对方案一进行优化):

    • 使用StringRedisTemplate

    • 写入Redis时,手动把对象序列化为JSON 或者 使用工具类JSONUtil进行序列化(推荐)

    • 读取Redis时,手动把读取到的JSON反序列化为对象

来源:https://blog.csdn.net/weixin_42949480/article/details/126952235

标签:Springboot,RedisTemplate,序列化
0
投稿

猜你喜欢

  • Java String类的理解及字符串常量池介绍

    2022-11-14 15:42:22
  • 浅析Java中comparator接口与Comparable接口的区别

    2023-11-01 20:31:14
  • Java Swing JList列表框的实现

    2021-09-05 08:20:56
  • Java的Spring框架中AOP项目的一般配置和部署教程

    2021-07-26 16:49:25
  • 浅谈java7增强的try语句关闭资源

    2022-04-29 18:57:29
  • java中删除 数组中的指定元素方法

    2023-02-02 12:45:59
  • 通过Java带你了解网络IO模型

    2022-12-25 10:59:22
  • jstorm源码解析之bolt异常处理方法

    2022-08-05 23:12:08
  • java poi设置生成的word的图片为上下型环绕以及其位置的实现

    2023-05-23 03:12:08
  • Java中MyBatis Plus知识点总结

    2023-08-11 14:12:04
  • 解析C#设计模式编程中备忘录模式的运用

    2023-06-10 11:40:00
  • java程序员如何编写更好的单元测试的7个技巧

    2023-09-05 14:57:24
  • Java反射机制基础详解

    2023-07-17 04:36:29
  • java.sql.Date和java.util.Date的区别详解

    2023-11-28 16:15:09
  • Java 八种基本类型和基本类型封装类

    2023-11-26 14:15:16
  • 解析MapStruct转换javaBean时出现的诡异事件

    2022-05-15 01:16:28
  • java原生序列化和Kryo序列化性能实例对比分析

    2023-11-26 16:04:20
  • 深入理解spring boot 监控

    2023-11-04 02:25:15
  • Java面向对象选择题总结归纳

    2023-08-05 23:30:21
  • 优化SpringBoot程序启动速度的实现

    2023-09-28 13:04:52
  • asp之家 软件编程 m.aspxhome.com