Springboot下RedisTemplate的两种序列化方式实例详解
作者:爱吃辣的People 发布时间:2021-09-11 11:48:47
标签: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反序列化为对象
来源:https://blog.csdn.net/weixin_42949480/article/details/126952235


猜你喜欢
- 本文实例为大家分享了Android实现图片点击 * 效果的具体代码,供大家参考,具体内容如下实现效果:需要注意的点:ValueAnimator
- 简介平时包括之前的例子大量是基于TouchListener如:onClick这种一类的事件。今天给大家带来的是TouchListener与O
- 在使用手机时,蓝牙通信给我们带来很多方便。那么在Android手机中怎样进行蓝牙开发呢?本文以实例的方式讲解Android蓝牙开发的知识。&
- 在 Java 中,方法调用一般通过 Virtual Call 还有 Classic Call。Classic Call 就是直接指向方法的地
- 使用maven引入jar<dependency> <groupId>com.itextpdf</g
- 一 前言springboot 额外的特色是提供了后台应用监控,可以通过 HTTP 或者 JMX的方式管理监控应用,本文主讲HTTP方式;其主
- import java.util.regex.Matcher;import java.util.regex.Pattern; /*
- 如何将jar包打包到指定目录今天分享一下springboot将jar包打包到指定目录下。由于之前上线都是一个打包到一个jar,由于服务多了,
- 相信大家在小的时候都玩过拼图游戏,现如今,手机普及,能在手机上玩的游戏越来越多,于是乎,重温小时候,编写这个简易拼图游戏,而且也能进一步加深
- 本文实例为大家分享了Java实现简单GUI登录和注册界面的具体代码,供大家参考,具体内容如下先看效果图:登陆界面:注册界面:实现代码如下:一
- 一、C#方法中参数类型有4种参数类型,有时候很难记住它们的不同特征,下图对它们做一个总结,使之更容易比较和对照。二、C#方法中的参数1、值参
- 声明一个客户端对象:protected RedisClient Redis = new RedisClient("127.0.0
- 本文的目的是用springboot整合mybatis实现一个简单的一对多查询。(查询一个用户有多少件衣服)第一步:数据库中,可以直接在nav
- C#2.0引入了泛型这个特性,由于泛型的引入,在一定程度上极大的增强了C#的生命力,可以完成C#1.0时需要编写复杂代码才可以完成的一些功能
- 项目中很多时候需要读取自定义配置文件,本地开发工具怎么写都成功但是部署到服务其上就出现问题,异常BOOT-INF/classes!/conf
- 1、RetentionPolicy.SOURCE:注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃;2、Retent
- 文件的上传及下载功能是开发人员在日常应用及编程开发中经常会遇到的。正好最近开发需要用到此功能,虽然本人是 Android 开发人员,但还是业
- 本文实例为大家分享了Java实现在线聊天室的具体代码,供大家参考,具体内容如下- 本文讲述了从实现单个多个客户的收发信息(基础简易版),到各
- 本文简单介绍如何引入validation的步骤,如何通过自定义validation减少代码量,提高生产力。特别提及:非基本类型属性的vali
- 目录生成器设计类图: 实现代码:优点:用途与缺点:责任链设计类图:实现代码:优点:用途和缺点:总结生成器生成器模式:封装一个产品的