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);
}
}
测试存入字符串
测试存入对象
对象类:
测试结果如下,能将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
标签: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