Java客户端SpringDataRedis(RedisTemplate)上手

文章目录

  • ⛄概述
  • ⛄快速入门
    • ❄️❄️导入依赖
    • ❄️❄️配置文件
    • ❄️❄️测试代码
  • ⛄数据化序列器
  • ⛄StringRedisTemplate
  • ⛄RedisTemplate的两种序列化实践方案总结


在这里插入图片描述

在这里插入图片描述


⛄概述

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封装到了不同的类型中:

在这里插入图片描述

redisTemplate 可以操作一些通用命令.


⛄快速入门

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

❄️❄️导入依赖

<?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 https://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><name>redis-demo</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version></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><!--Jackson依赖--><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId></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>

❄️❄️配置文件

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

❄️❄️测试代码

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

⛄数据化序列器

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

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

在这里插入图片描述

缺点:

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

可以自定义如下配置:

@Configuration
public class RedisConfig {@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory){// 创建RedisTemplate对象RedisTemplate<String, Object> template = new RedisTemplate<>();// 设置连接工厂template.setConnectionFactory(connectionFactory);// 创建JSON序列化工具GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();// 设置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 名称,目的是为了查询时实现自动反序列化。这会带来额外的内存开销。


⛄StringRedisTemplate

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

{"Class": "com.snow.Student","name": "wang","age": 18
}

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

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

在这里插入图片描述

这种用法比较普遍,因此SpringDataRedis就提供了RedisTemplate的子类:StringRedisTemplate,它的key和value的序列化方式默认就是String方式。省去了我们自定义RedisTemplate的序列化方式的步骤,而是直接使用:

@SpringBootTest
class RedisStringTests {@Autowiredprivate StringRedisTemplate stringRedisTemplate;@Testvoid testString() {// 写入一条String数据stringRedisTemplate.opsForValue().set("verify:phone:13600008888", "124143");// 获取string数据Object name = stringRedisTemplate.opsForValue().get("name");System.out.println("name = " + name);}private static final ObjectMapper mapper = new ObjectMapper();@Testvoid testSaveUser() throws JsonProcessingException {// 创建对象User user = new User("mayun", 21);// 手动序列化String json = mapper.writeValueAsString(user);// 写入数据stringRedisTemplate.opsForValue().set("user:200", json);// 获取数据String jsonUser = stringRedisTemplate.opsForValue().get("user:200");// 手动反序列化User user1 = mapper.readValue(jsonUser, User.class);System.out.println("user1 = " + user1);}
}

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

{"name": "wang","age": 18
}

⛄RedisTemplate的两种序列化实践方案总结

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

方案一
自定义 RedisTemplate
修改 RedisTemplate 的序列化器为 GenericJackson2JsonRedisSerializer
会占用额外的内存空间 记录字节码
方案二
使用 StringRedisTemplate
写入 Redis 时,手动把对象序列化为 JSON
读取 Redis 时,手动把读取到的 JSON 反序列化为对象

在这里插入图片描述


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/843316.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LLM学习笔记

Q1&#xff1a;SFT时&#xff0c;计算LOSS ​ LLM是自回归生成模型&#xff0c;每次只会生成一个 token&#xff0c;难道 SFT 时&#xff0c;对于一个 (L, D) 的数据&#xff0c;要调用 L 次LLM去计算loss&#xff1f; A1&#xff1a; ​ 在每个前向传播过程&#xff0c;模型…

HDU 2196 Computer(树形dp)

H D U 2196 C o m p u t e r &#xff08;树形 d p &#xff09; \Huge{HDU 2196 Computer&#xff08;树形dp&#xff09;} HDU2196Computer&#xff08;树形dp&#xff09; 文章目录 题意思路标程 题目链接&#xff1a;Problem - 2196 (hdu.edu.cn) 题意 给出一个n个节点的无…

论AI大模型炼丹与练舞的关系

AI大模型的训练和微调的区别&#xff0c;就像是在舞蹈中学习基础动作和编排新的舞蹈一样。 想象一下&#xff0c;你有一个神奇的舞蹈机器人&#xff0c;只要给它足够的舞蹈视频&#xff0c;它就能学会各种各样的舞步。 模型训练的过程就像是给这个舞蹈教练机器人一个包含了各种…

git将某次提交合并到另一个分支

一、需求背景 将分支b中的某一次提交单独合并到分支a 二、实现方案 需求&#xff1a;将分支b中的某一次提交单独合并到分支a 1.在git上查看指定某次提交的id&#xff0c;如下图所示&#xff1a; 也可以通过git log命令查看提交的id&#xff0c;如下图&#xff1a; git log…

CNN网络的介绍及实战

卷积神经网络&#xff08;Convolutional Neural Network&#xff0c;CNN&#xff09;是一种深度学习模型&#xff0c;它在计算机视觉领域取得了巨大成功。CNN的设计灵感来自于生物学中的视觉系统&#xff0c;旨在模拟人类视觉处理的方式。CNN由多层卷积层和池化层堆叠而成&…

【AIGC调研系列】MiniCPM-Llama3-V2.5模型与GPT-4V对比

MiniCPM-Llama3-V2.5模型与GPT-4V的对比可以从多个方面进行分析&#xff0c;包括性能、应用场景和技术特点。 从性能角度来看&#xff0c;MiniCPM-Llama3-V2.5在OCR识别、模型幻觉能力和空间理解能力方面表现出色&#xff0c;实现了开源模型的性能SOTA&#xff08;State of th…

Android13 基座充电屏保

屏幕保护有两个设置可选&#xff1a;默认为插入基座充电时 通过DreamBackend启用屏保&#xff0c;并且保存选择的时机 //QSSI.13\packages\apps\Settings\src\com\android\settings\dream\WhenToDreamPicker.java Override protected boolean setDefaultKey(String key) {mBac…

LeetCode hot100-50-G

124. 二叉树中的最大路径和二叉树中的 路径 被定义为一条节点序列&#xff0c;序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点&#xff0c;且不一定经过根节点。路径和 是路径中各节点值的总和。给你一个二叉树的根…

linux input 驱动

使用文档 设备树修改 新增一个 LED 节点 arch/arm/boot/dts/arm/vexpress-v2p-ca9.dts my_pl_led {compatible = "arm, cortex-a9-led";status = "okay";};设备树编译 make dtbs日志 DTC arch/arm/boot/dts/arm/vexpress

AI视频换脸!最快的方法,100%成功,完全免费,无需配置、打开即用

这是一款百分百完全免费&#xff0c;超级好用又简单的AI视频换脸工具&#xff0c;不仅效果非常不错而且支持CPU和GPU解码&#xff0c;即使电脑上没有独立显卡&#xff0c;你也可以通过电脑上的CPU要进解码&#xff0c;虽然我之前给他介绍好几个有关AI视频&#xff0c;比如像这个…

通关!游戏设计之道Day17

音乐里的音符 音乐能给任何娱乐体验增色不少。 主题公园景区&#xff0c;电影或电子游戏都少不了它。 在考虑音乐设计时&#xff0c;你需要弄清楚的第一个问题是&#xff1a;“我想要什么类型的音乐&#xff1f;” 关于这个问题&#xff0c;确切的答案有两个&#xff1a;用…

46. 全排列 - 力扣(LeetCode)

基础知识要求&#xff1a; Java&#xff1a;方法、集合、泛型、Arrays工具类、数组、for循环、if判断 Python&#xff1a; 方法、列表、for循环、if判断 题目&#xff1a; 给定一个不含重复数字的数组 nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意顺序 返回答案…

网络原理-HTTPS协议

在前面说到HTTP中,我们通过抓包,可以看到许多信息内容,其中往往会包含一些敏感信息,这些都是明文传输,当我们的请求被黑客或者不法分子截获后,那就很危险了,因此衍生出了HTTPS协议来对传输数据进行加密。 一、加密原理 基本原理如下&#xff1a; 明文 密钥 > 密文 密文…

【一竞技DOTA2】RAMZES666替补参加裂变联赛

1、根据主办方文件,RAMZES666将继续作为Tundra战队替补参加裂变联赛。该比赛为欧洲线上赛,于5月27日-30日举行,总奖金8万美元。 除此之外,Nigma战队在上个月宣布四号位Matthew离队后,也选择启用老队员GH参赛。而在本月初让ah fu转回教练、携替补Thiolicor出战PGL瓦拉几亚的Secr…

远程户外监控组网方案,工业4G路由器ZR2000

户外监控无人值守4G工业路由器组网应用涉及工业自动化、数据传输和远程监控的重要领域。在户外没有光纤的情况下&#xff0c;想要让监控或传感器等设备联网&#xff0c;仅需一台4G工业路由器即可解决。以下是关于远程监控户外组网的详细分析与应用&#xff1a; 物联网应用场景 …

【2024系统架构设计】回顾历史,查缺补漏篇 ④

前言 hello,大家好: 💡💡💡 我们一起来备考软考高级系统架构设计师吧,本专栏提供综合知识、案例科目、论文(论点和部分示例范文)等内容,包括知识点总结和记忆小妙招哦。 🚀🚀🚀 可以减少资料查找和收集的时间,提高效率,我们一起集中精力学习干货吧! 💡…

开源浪潮与闭源堡垒:大模型未来的双重奏

从数据隐私、商业应用和社区参与等方面来看&#xff0c;开源大模型和闭源大模型各有优劣势。开源模型在透明度、社区协作和成本效益方面具有优势&#xff0c;而闭源模型在安全性、合规性和商业竞争力方面表现出色。因此&#xff0c;我更倾向于认为&#xff0c;未来的大模型发展…

#php的pecl工具#

pecl&#xff08;php拓展社区库&#xff0c;pear拓展版本&#xff09;是一个官方的php扩展仓库&#xff0c;提供了众多优秀的php扩展供开发人员使用,作用主要是给php安装php扩展 1:安装PECL 首先&#xff0c;需要确保已安装PHP和PECL。PECL通常随着PHP一起安装&#xff0c;但…

【Python】 Python中__slots__的妙用:提升性能与内存管理

基本原理 在Python中&#xff0c;每个类默认都会继承自object类&#xff0c;而object类在Python中是一个动态类&#xff0c;允许动态地添加属性和方法。这种灵活性使得Python在某些情况下非常强大和灵活&#xff0c;但同时也带来了一些性能和内存使用上的开销。 为了解决这个…

互联网十万个为什么之什么是容器?

容器是一种虚拟化技术&#xff0c;用于将应用程序及其所有依赖项打包在一起&#xff0c;以便在不同的计算环境中进行移植和运行。容器提供了一种隔离的运行环境&#xff0c;使不同应用程序能够在独立的文件系统、网络和进程空间等独立运行环境中运行&#xff0c;提升了安全性和…