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反序列化为对象
到此这篇关于Springboot下RedisTemplate的两种序列化方式的文章就介绍到这了,更多相关Springboot RedisTemplate序列化内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
SpringBoot使用AES对JSON数据加密和解密的实现方法
这篇文章主要介绍了SpringBoot使用AES对JSON数据加密和解密的实现方法,文章通过代码示例介绍的非常详细,对我们的学习或工作有一定的帮助,需要的朋友可以参考下2023-08-08Spring boot集成easy excel实现导入导出功能
这篇文章主要介绍了Spring boot集成easy excel实现导入导出操作,使用easyexcel,首先要引入easyexcel的maven依赖,具体的版本根据你的需求去设置,本文结合实例代码讲解的非常详细,需要的朋友可以参考下2024-05-05Java中使用print、printf、println的示例及区别
Java 的输出方式一般有这三种,print、println、printf,它们都是 java.long 包里的System类中的方法,本文重点给大家介绍Java中使用print、printf、println的示例,需要的朋友可以参考下2023-05-05
最新评论