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

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://www.xdnf.cn/news/20302.html

相关文章:

  • 脑电数据预处理十五:小波变换从原理到实践
  • Codeforces Round 1046 (Div. 2) vp补题
  • C++ 详细讲解vector类
  • 检查CDB/PDB 表空间的说明
  • Linux网络接口命名详解:从eth0到ens33
  • [光学原理与应用-431]:非线性光学 - 能生成或改变激光波长的物质或元件有哪些?
  • GPIO的配置中开漏输出与推挽输出的差别
  • C++零基础第四天:顺序、选择与循环结构详解
  • Protobuf
  • 人工智能辅助荧光浓度检测系统:基于YOLO与RGB分析的Python实现
  • 【序列晋升】29 Spring Cloud Task 微服务架构下的轻量级任务调度框架
  • AP1272:新一代高性能LDO稳压器,为精密电子系统提供更优电源解决方案
  • 《秦时明月》系列经典语录分享
  • 云原生的12个要素是什么?
  • 【Linux指南】动静态库与链接机制:从原理到实践
  • 疯狂星期四文案网第62天运营日记
  • 消失的6个月!
  • 从文本到知识:使用LLM图转换器构建知识图谱的详细指南
  • Java多线程学习笔记
  • Nginx 实战系列(二)—— Nginx 配置文件与虚拟主机搭建
  • QML Charts组件之LineSeries、SplineSeries与ScatterSeries
  • 正态分布 - 正态分布的经验法则(68-95-99.7 法则)
  • Modbus通信的大端和小端字节序
  • OpsManage 项目启动脚本与 Docker 配置深度分析
  • Day05 单调栈 | 84. 柱状图中最大的矩形、42. 接雨水
  • LeetCode算法日记 - Day 34: 二进制求和、字符串相乘
  • 【目录-多选】鸿蒙HarmonyOS开发者基础
  • 分布式go项目-搭建监控和追踪方案
  • 国内外支持个人开发者的应用市场
  • OpenCV - 图像的IO操作