当前位置: 首页 > news >正文

Redis《RedisSerializer》

文章目录

  • RedisSerializer
    • 为什么要使用
    • 如何使用RedisSerializer
  • 总结


RedisSerializer

为什么要使用

RedisTemplate 有默认的序列化器,但默认使用的
JdkSerializationRedisSerializer 存在一些问题:
在这里插入图片描述

  • 序列化后的数据包含类信息等额外内容,导致存储的数据体积较大
  • 生成的是二进制数据,在 Redis 客户端中查看时可读性差

RedisTemplate 是操作 Redis 的主体,而 RedisSerializerRedisTemplate 中负责数据格式转换的关键组件。正确配置序列化器可以让 Redis 存储的数据更高效、更易读、更具兼容性

首先看一下RedisTemplate的部分源码
在这里插入图片描述

这四个引用默认为空,当afterPropertiesSet方法进行判断时,为空的话,默认创建一个jdk的序列化器,这就是后面我们会调用的类
在这里插入图片描述

现在我们使用这个对象的set方法,通过debug方式看看它怎么运行

在这里插入图片描述

当我们点击set方法

在这里插入图片描述
会将传入的key和value传入rawKey和rawValue,当我们点入rawKey

在这里插入图片描述

这里的逻辑有点绕,可能大家会想,我明明没有设置序列化器,为什么还是走else

其实不是

在这里插入图片描述

这里我们可以看到,如果我们不定义序列化器,他会把上面的afterPropertiesSet方法初始化的JdkSerializationRedisSerializerkeySerializer,后续我们所调用的序列化器就有了默认的序列化器

小插曲:大家知道为什么会调用afterPropertiesSet方法吗?

还是源码

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

当一个 Bean 实现了 InitializingBean 接口后,Spring 容器在完成该 Bean 的所有属性注入(即调用完所有 setter 方法)后,会自动调用接口中的 afterPropertiesSet() 方法。

书接上回,经过一系列的赋值和调用,这里会判断是否已经自己定义序列化器,如果没有,且我们自己将key给序列化了——不是自动的

比如我自己将"user:100"序列化了,这样redis就能直接存储原始的二进制,不需要再进行序列化转换

虽然我们没有设定序列化器但我们有默认的,且没有手动将字符串序列化,所以我们走else
点击serialize()
在这里插入图片描述
在这里插入图片描述如果是debug的形式我们会进入这个类——熟悉吗,上面初始化的类

在这里插入图片描述
点击convert()

在这里插入图片描述
点击serializeToByteArray()
在这里插入图片描述
这里我们可以看到通过ObjectOutputStream类将java对象转成字节

在这里插入图片描述

最后会在redis中以这样的方式存储


如何使用RedisSerializer

引入依赖

<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId>
</dependency>
@Configuration
public class RedisConfig {@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {// 创建RedisTemplate对象RedisTemplate<String, Object> template = new RedisTemplate<>();// 设置连接工厂template.setConnectionFactory(connectionFactory);// 设置序列化工具GenericJackson2JsonRedisSerializer serializer = new GenericJackson2JsonRedisSerializer();// 设置key的序列化template.setKeySerializer(RedisSerializer.string());template.setHashKeySerializer(RedisSerializer.string());// 设置value的序列化template.setValueSerializer(serializer);template.setHashValueSerializer(serializer);// 返回return template;}}

这里实际上就是将我们之前提到的几个引用为null的引用进行赋值,从而改变序列化器,改变reids中存储的内容

@SpringBootTest
class SpringdataredisDemoApplicationTests {@Resourceprivate RedisTemplate redisTemplate;@Testvoid testString() {redisTemplate.opsForValue().set("name", "虎哥");// 从redis中获取nameObject name = redisTemplate.opsForValue().get("name");System.out.println("name: " + name);}
}

在这里插入图片描述

总结

本篇博客介绍了有关RedisTemplate中的RedisSerializer,关于为什么要用,已经如何使用,如果有什么不正确或比较片面的地方,还望指正,谢谢大家!!!


文章转载自:

http://ri5Yhk3w.dzpnL.cn
http://NKNKjCE4.dzpnL.cn
http://mFdb7ja0.dzpnL.cn
http://HS7ZpGZp.dzpnL.cn
http://4Q75gAQn.dzpnL.cn
http://2ZzcRSlg.dzpnL.cn
http://0fcsF4pG.dzpnL.cn
http://ER6kHjYm.dzpnL.cn
http://gl1VPOc7.dzpnL.cn
http://9L3epQqQ.dzpnL.cn
http://bgwF0ch0.dzpnL.cn
http://kSs1ZYdP.dzpnL.cn
http://oogFfuGh.dzpnL.cn
http://zrDWNMUD.dzpnL.cn
http://pDtf44z0.dzpnL.cn
http://fhjdu5jb.dzpnL.cn
http://XoBWikw5.dzpnL.cn
http://riuqhMQt.dzpnL.cn
http://2q8EucD5.dzpnL.cn
http://IuRBFm9L.dzpnL.cn
http://6yJTAQhO.dzpnL.cn
http://z0SHjOQP.dzpnL.cn
http://llj7YJU2.dzpnL.cn
http://U7bhC5bs.dzpnL.cn
http://SeR8JAhq.dzpnL.cn
http://LAGmV8Yq.dzpnL.cn
http://Y06NzmfU.dzpnL.cn
http://VABk9CVU.dzpnL.cn
http://HxI0DUwj.dzpnL.cn
http://z2IgFrHV.dzpnL.cn
http://www.dtcms.com/a/369956.html

相关文章:

  • 云原生的12个要素是什么?
  • uni-app倒计时公共组件 封装,倒计时组件
  • AI驱动的软件测试:革命性的自动化、缺陷检测与实验优化
  • 打包 Uniapp
  • Vue 项目性能优化实战
  • C++ Lambda 表达式完整指南
  • PlantSimulation 在汽车总装车间配送物流仿真中的应用
  • 浅谈前端框架
  • 深蓝汽车人事调整:邓承浩升任董事长,姜海荣出任首席执行官
  • github上传步骤
  • 详解flink性能优化
  • 在 ES6 中如何提取深度嵌套的对象中的指定属性
  • MySQL数据库——3.2.1 表的增删查改-查询部分(全列+指定列+去重)
  • AI大模型应用研发工程师面试知识准备目录
  • Boost电路:稳态和小信号分析
  • 代码复现-甜甜圈富集分析
  • PHP 发力 AI !PHP 官方 MCP SDK 正式发布
  • 从0死磕全栈第五天:React 使用zustand实现To-Do List项目
  • 从0死磕全栈第3天:React useState 实战,用 TS 手搓一个注册表单
  • MacOS 使用 luarocks+wrk+luajit
  • Rust在医疗系统中的应用:安全、性能与合规性实践(上)
  • 《云原生微服务治理进阶:隐性风险根除与全链路能力构建》
  • 006-Dephi 表达式 选择语句 循环语句其他语句
  • 深度学习:残差网络ResNet与迁移学习
  • SQL 实战指南:校园图书管理系统 SQL 设计(借阅 / 归还 / 库存查询实现)——超全项目实战练习
  • 输入2.2V~16V 最高输出20V2.5A DCDC升压芯片MT3608L
  • 人工智能学习:什么是seq2seq模型
  • 【基础-单选】singleton模式下首次进入的执行顺序是
  • 基于YOLO8的汽车碰撞事故检测系统【数据集+源码+文章】
  • 【c++进阶系列】:万字详解AVL树(附源码实现)