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

SpringDataRedis 操作 Redis,并指定数据序列化器

文章目录

  • 1. SpringDataRedis 概述
  • 2. 快速入门
    • 2.1 导入pom坐标
    • 2.2 配置文件
    • 2.3 测试代码
    • 2.4 数据序列化器
    • 2.5 StringRedisTemplate
    • 2.6 总结



在这里插入图片描述

1. SpringDataRedis 概述

SpringDataSpring 中数据操作的模块,包含对各种数据库的集成,其中对Redis的集成模块就叫做 SpringDataRedis,官网地址:https://spring.io/projects/spring-data-redis

  • 提供了对不同Redis客户端的整合(Lettuce和Jedis)
  • 提供了RedisTemplate统一API来操作Redis
  • 支持Redis的发布订阅模型
  • 支持Redis哨兵和Redis集群
  • 支持基于Lettuce的响应式编程
  • 支持基于JDK.JSON.字符串.Spring对象的数据序列化及反序列化
  • 支持基于Redis的JDKCollection实现

SpringDataRedis中提供了RedisTemplate工具类,其中封装了各种对Redis的操作。并且将不同数据类型的操作API封装到了不同的类型中:

在这里插入图片描述


2. 快速入门

SpringBoot 已经提供了对 SpringDataRedis 的支持,使用非常简单:

2.1 导入pom坐标

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.5.7</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.snow</groupId><artifactId>studyRedis</artifactId><version>1.0</version><properties><java.version>1.8</java.version><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><dependencies><!--redis依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><!--common-pool--><dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.70</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin></plugins></build></project>

2.2 配置文件

spring:redis:host: 192.168.98.98port: 6379password: snowlettuce:pool:max-active: 8  #最大连接max-idle: 8   #最大空闲连接min-idle: 0   #最小空闲连接max-wait: 100ms #连接等待时间

2.3 测试代码

@SpringBootTest
class RedisDemoApplicationTests {@Autowiredprivate RedisTemplate<String, Object> redisTemplate;@Testvoid testString() {// 写入一条String数据redisTemplate.opsForValue().set("age", "20");// 获取string数据Object age = redisTemplate.opsForValue().get("age ");System.out.println("age = " + age );}
}

2.4 数据序列化器

RedisTemplate 可以接收任意 Object 作为值写入 Redis

只不过写入前会把Object序列化为字节形式,默认是采用JDK序列化,得到的结果是这样的:

在这里插入图片描述

缺点:

  • 可读性差
  • 内存占用较大

我们可以自定义 RedisTemplate 的序列化方式,代码如下:

@Configuration
public class RedisConfig {@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory){// 创建 RedisTemplate 对象RedisTemplate<String, Object> template = new RedisTemplate<>();// 设置连接工厂template.setConnectionFactory(connectionFactory);// 创建 Fastjson 序列化工具FastJsonRedisSerializer<Object> jsonRedisSerializer = new FastJsonRedisSerializer<>(Object.class);// 设置 Key 序列化template.setKeySerializer(RedisSerializer.string());template.setHashKeySerializer(RedisSerializer.string());// 设置 Value 序列化template.setValueSerializer(jsonRedisSerializer);template.setHashValueSerializer(jsonRedisSerializer);// 返回return template;}
}

这里采用了 JSON 序列化来代替默认的 JDK 序列化方式。最终结果如图:

在这里插入图片描述

整体可读性有了很大提升,并且能将Java对象自动的序列化为JSON字符串,并且查询时能自动把JSON反序列化为Java对象。

不过,其中记录了序列化时对应的 class 名称,目的是为了查询时实现自动反序列化。这会带来额外的内存开销。


2.5 StringRedisTemplate

尽管之前 JSON 的序列化方式可以满足我们的需求,但依然存在一些问题,如图:

在这里插入图片描述

为了在反序列化时知道对象的类型,JSON序列化器会将类的class类型写入json结果中,存入Redis,会带来额外的内存开销。

为了减少内存的消耗,我们可以采用手动序列化的方式,换句话说,就是不借助默认的序列化器,而是我们自己来控制序列化的动作,同时,我们只采用String的序列化器,这样,在存储value时,我们就不需要在内存中就不用多存储数据,从而节约我们的内存空间

在这里插入图片描述

这种用法比较普遍,因此 SpringDataRedis 就提供了 RedisTemplate 的子类:StringRedisTemplate,它的key和value的序列化方式默认就是String方式。

省去了我们自定义RedisTemplate的序列化方式的步骤,而是直接使用:

@SpringBootTest
class RedisStringTests {@Autowiredprivate StringRedisTemplate stringRedisTemplate;@Testvoid testSaveUser() {// 写入一条String数据ValueOperations<String, String> opsForValue = stringRedisTemplate.opsForValue();Student student = new Student(2, "swallow", 12);opsForValue.set("swallow", JSON.toJSONString(student));}}

此时我们再来看一看存储的数据,小伙伴们就会发现那个class数据已经不在了,节约了我们的空间(节约了一半呢~~~)~

在这里插入图片描述


当使用了 fastjson 作为序列化方式后,也可以使用 redisTemplate :

 @Testvoid testString3() {// 写入一条String数据ValueOperations opsForValue = redisTemplate.opsForValue();Student student = new Student(12, "刘德华", 42);opsForValue.set("liudehua", student);System.out.println("liudehua:" + opsForValue.get("liudehua"));}

在这里插入图片描述


2.6 总结

RedisTemplate的两种序列化实践方案:

  • 方案一:

    • 自定义RedisTemplate
  • 修改RedisTemplate的序列化器为GenericJackson2JsonRedisSerializer

    会占用额外的内存空间 记录字节码

  • 方案二:

    • 使用StringRedisTemplate
    • 写入Redis时,手动把对象序列化为JSON
    • 读取Redis时,手动把读取到的JSON反序列化为对象

在这里插入图片描述

相关文章:

SpringDataRedis 操作 Redis,并指定数据序列化器

文章目录 1. SpringDataRedis 概述2. 快速入门2.1 导入pom坐标2.2 配置文件2.3 测试代码2.4 数据序列化器2.5 StringRedisTemplate2.6 总结 1. SpringDataRedis 概述 SpringData 是Spring 中数据操作的模块&#xff0c;包含对各种数据库的集成&#xff0c;其中对Redis的集成模…...

useradd 在Linux原生应用开发过程中的简单应用

useradd命令是用于在Linux系统中创建新用户的命令。它可以创建一个新用户&#xff0c;并设置该用户的属性、家目录、默认shell等。useradd命令实际上是一个包装了一系列系统调用的高级命令。 在Linux系统中&#xff0c;用户信息存储在/etc/passwd文件中。当执行useradd命令时&…...

Linux 删除文件名乱码的文件

现象&#xff1a; 处理&#xff1a; 1.>ls -li 获取文件对应的ID号 2.把删除指定文件&#xff08;ID号 &#xff09;执行&#xff1a; find ./ -inum 268648910 -exec rm {} \;...

【测试人生】数据同步和迁移的变更注意事项

数据同步或者迁移操作也算是线上数据变更的一种类型。由于涉及的数据量非常大&#xff0c;一旦发生故障&#xff0c;会直接影响线上业务&#xff0c;并且较难止损。从变更风险管控的角度考虑&#xff0c;数据同步或迁移操作也需要走合理的发布窗口&#xff0c;并且在操作前也需…...

快手视频如何去掉水印?三个简单好用视频去水印方法

快手视频如何去掉水印&#xff1f;尽管新兴的短视频平台如春笋般涌现&#xff0c;吸引了众多观众在业余时间浏览和分享视频&#xff0c;快手作为当下主流短视频之一&#xff0c;许多自媒体创作者也常常会下载一些热门的视频素材进行二次编辑。然而&#xff0c;他们都可能会面临…...

【Linux】stat命令使用

stat命令 stat命令用于显示文件的状态信息。stat命令的输出信息比ls命令的输出信息要更详细。 著者 由Michael Meskes撰写。 stat命令 -Linux手册页 语法 stat [文件或目录] 命令选项及作用 执行令 &#xff1a; stat --help 执行命令结果 参数 -L、 --dereference 跟…...

【JavaEE】多线程(3) -- 线程等待 wait 和 notify

目录 1. wait()⽅法 2. notify()⽅法 3. notifyAll()⽅法 4. wait 和 sleep 的对⽐&#xff08;⾯试题&#xff09; 由于线程之间是抢占式执⾏的, 因此线程之间执⾏的先后顺序难以预知. 但是实际开发中有时候我们希望合理的协调多个线程之间的执⾏先后顺序. 完成这个协调⼯…...

自行编写一个简单的shell!

本文旨在编写一个简单的shell外壳程序&#xff01;功能类似于shell的一些基本操作&#xff01;虽然不能全部实现shell的一些功能&#xff01;但是通过此文章&#xff0c;自己写一个简单的shell程序也是不成问题&#xff01;并且通过此文章&#xff0c;可以让读者对linux中一些环…...

mvn site 命令

概述 在Maven中&#xff0c;site指的是一个特定的阶段&#xff0c;其目的是生成项目相关的站点文档。这些站点文档可以为项目的开发者、用户、以及其他利益相关者提供有关项目的详细信息。 Maven的站点文档通常包括以下内容&#xff1a; 项目信息&#xff1a;这部分提供了关于…...

<JavaEE> 经典设计模式之 -- 定时器

目录 一、定时器的概念 二、Java 标准库中的定时器 三、实现自己的定时器 一、定时器的概念 什么是定时器&#xff1f;定时器是软件开发中的一个常用且重要组件&#xff0c;作用是在达到设定时间后&#xff0c;执行指定的代码。 二、Java 标准库中的定时器 1&#xff09;T…...

【C++ Primer Plus学习记录】if语句

目录 一、if语句 二、if else语句 三、格式化if else语句 四、if else if else结构 一、if语句 if语句让程序能够决定是否应执行特定的语句。 if有两种格式&#xff1a;if和if else。 if语句的语法与while相似&#xff1a; if(test-condition)statement; 如果test-con…...

结构体,自定义类型

目录 结构体 结构体的声明 结构体的自引用 结构体的定义和初始化 结构体内存对齐 ​编辑 结构体的对齐规则&#xff1a; 为什么存在内存对齐&#xff1f; 修改默认对齐数 结构体传参 位段 什么是位段 位段的内存分配 位段的跨平台问题 枚举 联合&#xff08;共用体…...

Ubuntu22.04通过Maas和Juju部署openstack charm

目录 官方文档材料准备软件硬件 模板机和虚拟网络安装MAAS官方文档MAAS节点配置安装MAAS浏览器登录MAAS进行配置 激活DHCP 官方文档 https://docs.openstack.org/project-deploy-guide/charm-deployment-guide/2023.1/ 这是一个通过Maas面板即可部署openstack的方式&#xff0…...

老有所依:TSINGSEE青犀养老院智能视频监管方案

养老院智能监控方案是为了提高养老院内老人的安全和护理质量&#xff0c;利用智能技术与监控设备进行全方位的监控和管理&#xff0c;可以加强对老人的监护和护理&#xff0c;提高养老院的服务质量和安全性。 旭帆科技基于视频技术与AI智能分析技术构建的养老院智能视频监控方…...

vue中的this.$nextTick().then()

MENU 示例一示例二sortsplicepushrandomfloorMathwhile演示 示例一 let reorganize function (arr){let rest [];while (arr.length > 0) {let random Math.floor(Math.random() * arr.length);// 把获取到的值放到新定义的数组中rest.push(arr[random]);// 这句代码的作…...

Python处理Excel文件并与数据库匹配做拼接

Python处理Excel文件并与数据库匹配做拼接 需求&#xff1a;Python处理Excel中数据并于数据库交互匹配得到账号信息等其他操作 Python实现 import os import pandas as pd import pymssql import warnings import time# 提取速率函数 def extract_broadband_speed(speed):if…...

【出现模块node_modules里面包找不到】

#pic_center R 1 R_1 R1​ R 2 R^2 R2 目录 一、出现的问题二、解决办法三、其它可供参考 一、出现的问题 在本地运行 npm run docs:dev之后&#xff0c;出现 Error [ERR_MODULE_NOT_FOUND]: Cannot find package Z:\Blog\docs\node_modules\htmlparser2\ imported from Z:\Blo…...

高项备考葵花宝典-项目进度管理输入、输出、工具和技术(中,很详细考试必过)

项目进度管理的目标是使项目按时完成。有效的进度管理是项目管理成功的关键之一&#xff0c;进度问题在项目生命周期内引起的冲突最多。 小型项目中&#xff0c;定义活动、排列活动顺序、估算活动持续时间及制定进度模型形成进度计划等过程的联系非常密切&#xff0c;可以视为一…...

sql注入 [GXYCTF2019]BabySQli1

打开题目 多次尝试以后我们发现存在一个admin的账号&#xff0c;但是密码我们不知道 我们尝试一下万能密码 admin or 11 -- q 报错 我们尝试bp抓一下包看看 看着很像编码 先去base32解码 再base64解码 得到 我们从这个sql语句中得到注入点为name 根据报错信息我们知道是…...

python二维数组创建赋值问题:更改单个值却更改了所有项的值

test_list [] dic1 {} test_list [dic1 for _ in range(3)] ll [1, 2, 3]for i in range(3):test_list[i][value] ll[i]print(test_list)运行结果&#xff1a;每次赋值都更改了所有项 原因&#xff1a;python的二位数据创建方式就是这样&#xff0c;官方文档中有描述Wha…...

从‘交并比’到损失函数:一文搞懂Dice Loss在图像分割里的前世今生与代码实现

从集合相似度到像素级优化&#xff1a;Dice Loss在图像分割中的数学本质与工程实践当你在显微镜下观察一张病理切片时&#xff0c;那些蜿蜒交错的细胞边界决定了诊断结果&#xff1b;当自动驾驶汽车识别前方障碍物时&#xff0c;每个像素的分类关乎生命安全。图像分割作为计算机…...

DeepSeek-R1模型压缩到<380MB还能保持98.7%对话准确率?——边缘设备量化微调四步法首次公开

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;DeepSeek边缘设备部署 DeepSeek系列大模型在边缘侧的轻量化部署&#xff0c;正成为工业质检、智能安防与车载语音等低延迟场景的关键技术路径。其核心挑战在于平衡模型精度、推理吞吐与硬件资源约束——…...

ChatGPT写不出合格投资人邮件?错!真正稀缺的是这5个私募股权语境理解层(附LP偏好词云图谱)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;ChatGPT投资人邮件撰写的核心误区与范式跃迁 许多创业者在使用ChatGPT辅助撰写面向投资人的邮件时&#xff0c;陷入“信息堆砌型”表达陷阱——将产品功能、技术参数、市场数据不加筛选地塞入正文&…...

ALMA评审系统:基于分层规则与LDA的专家精准匹配工程实践

1. 项目概述&#xff1a;当评审专家遇上“千人千面”的提案在科研项目管理&#xff0c;尤其是大型天文观测设施如ALMA&#xff08;阿塔卡马大型毫米/亚毫米波阵列&#xff09;的提案评审中&#xff0c;一个核心的工程难题是如何把一份探讨“原行星盘尘埃动力学”的提案&#xf…...

毕业设计 深度学习yolo11水果识别系统(源码+论文)

文章目录0 前言1 项目运行效果2 课题背景2.1. 课题背景2.1.1 农业现代化与智能化需求2.1.2 计算机视觉在农业中的应用发展2.1.3 目标检测技术演进2.1.3.1 传统图像处理阶段&#xff08;2000-2012&#xff09;2.1.3.2 机器学习阶段&#xff08;2012-2016&#xff09;2.1.3.3 深度…...

Frida高级脚本编写:绕过加固、动态定位混淆方法与Native层Hook

1. 这不是“装个插件就能跑”的教程&#xff0c;而是你真正要动手写脚本的起点很多人点开“Frida Objection 自动化安全测试”这类标题&#xff0c;心里想的是&#xff1a;下载个 Objection CLI&#xff0c;objection -g com.example.app explore一敲&#xff0c;再android ho…...

跨平台资源包管理工具VPKEdit:游戏开发者的终极解决方案

跨平台资源包管理工具VPKEdit&#xff1a;游戏开发者的终极解决方案 【免费下载链接】VPKEdit A CLI/GUI tool to create, read, and write several pack file formats. 项目地址: https://gitcode.com/gh_mirrors/vp/VPKEdit 在游戏开发和MOD制作过程中&#xff0c;资源…...

GetQzonehistory:3分钟学会永久保存QQ空间记忆的终极免费方案

GetQzonehistory&#xff1a;3分钟学会永久保存QQ空间记忆的终极免费方案 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否曾担心QQ空间里那些珍贵的青春记忆会随着时间流逝而消失…...

【限时技术白皮书】:DeepSeek全版本演进时间轴+企业级选型 checklist(含许可证限制红线)

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;DeepSeek模型版本选择 DeepSeek 提供多个公开可获取的模型版本&#xff0c;涵盖不同参数规模、推理精度与部署场景需求。正确选择版本是构建高性能AI应用的前提&#xff0c;需综合考量硬件资源、延迟要求、任务…...

如何免费绕过iOS激活锁:Applera1n完整解决方案指南

如何免费绕过iOS激活锁&#xff1a;Applera1n完整解决方案指南 【免费下载链接】applera1n icloud bypass for ios 15-16 项目地址: https://gitcode.com/gh_mirrors/ap/applera1n 你是否曾因忘记Apple ID密码而面对无法使用的iPhone束手无策&#xff1f;或者购买的二手…...