Spring Boot 中 对话 Redis

Redis 是一款开源的,使用 C 开发的高性能内存 Key/Value 数据库,支持 String、Set、Hash、List、Stream 等等数据类型。它被广泛用于缓存、消息队列、实时分析、计数器和排行榜等场景。基本上是当代应用中必不可少的软件!

Spring Boot 对 Redis 提供了开箱即用的组件:spring-boot-starter-data-redis。通过这个 starter,我们只需要几行简单的配置就可以快速地在 Spring Boot 中整合、使用 Redis。

Spring Boot 整合 Redis

Maven 依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId>
</dependency>

除了 spring-boot-starter-data-redis 外,还添加了 commons-pool2 依赖,是因为我们需要使用到连接池。

配置属性

只需要在 application.yaml | properties 中配置如下常用的基本属性即可:

spring:redis:# 连接地址host: "localhost"# 端口port: 6379# 数据库database: 0# 用户名,如果有# username:# 密码,如果有# password:# 连接超时connect-timeout: 5s# 读超时timeout: 5s# Lettuce 客户端的配置lettuce:# 连接池配置pool:# 最小空闲连接min-idle: 0# 最大空闲连接max-idle: 8# 最大活跃连接max-active: 8# 从连接池获取连接 最大超时时间,小于等于0则表示不会超时max-wait: -1ms

「注意,如果你使用的 不是 spring boot 2.x ,上述配置的命名空间 不应该是 spring.redis 而是 spring.data.redis

使用 Jedis 客户端

Spring Data Redis 默认使用 Lettuce 作为 Redis 客户端。
官方还对 Jedis 提供了支持,你可以根据你的喜好进行选择。
当然推荐在项目中使用 lettuce 客户端,因为它是基于 Netty 开发,支持非阻塞式 IO,性能会更好。

要替换为 Jedis,首先需要从 spring-boot-starter-data-redis 排除 lettuce ,并且添加 jedis 依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId><exclusions><exclusion><groupId>io.lettuce</groupId><artifactId>lettuce-core</artifactId></exclusion></exclusions></dependency><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId>
</dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId>
</dependency> 

然后修改配置文件,把 lettuce 配置替换为 jedis 配置即可:

spring:redis:# jedis客户端的配置jedis:# 连接池配置pool:# 最小空闲连接min-idle: 0# 最大空闲连接max-idle: 8# 最大活跃连接max-active: 8# 从连接池获取连接 最大超时时间,小于等于0则表示不会超时max-wait: -1ms

使用 StringRedisTemplate

配置就绪后,StringRedisTemplate 已经可用,你可以在任何地方注入、使用:

@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
public class DemoApplicationTests {static final Logger logger = LoggerFactory.getLogger(DemoApplicationTests.class);// 注入 StringRedisTemplate@AutowiredStringRedisTemplate stringRedisTemplate;@Testpublic void test() {// 设置this.stringRedisTemplate.opsForValue().set("title", "spring 中文网", Duration.ofMinutes(5));// 读取String val = this.stringRedisTemplate.opsForValue().get("title");logger.info("value={}", val);}
}   

对于 StringRedisTemplate 更完整的方法列表,你可以参阅其 java doc。

自定义 RedisTemplate

如果基本的 StringRedisTemplate 不能满足你的需求,你也可以自定义 RedisTemplate 实现。

例如,我们想要自定义一个 JsonRedisTemplate,用于把任意 Java 对象序列化为 json 数据存储到 Redis,并且也能够把 Redis 中的 json 数据反序列化为任意 Java 对象。

如下:

package com.zcdf.school.components;import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.stereotype.Component;@Component
public class JsonRedisTemplate extends RedisTemplate<String, Object> {public JsonRedisTemplate(RedisConnectionFactory redisConnectionFactory) {// 构造函数注入 RedisConnectionFactory,设置到父类super.setConnectionFactory(redisConnectionFactory);Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<>(Object.class);ObjectMapper objectMapper = new ObjectMapper();objectMapper.registerModule(new JavaTimeModule());serializer.setObjectMapper(objectMapper);// String 类型的 key/value 序列化super.setKeySerializer(StringRedisSerializer.UTF_8);super.setValueSerializer(serializer);// Hash 类型的 key/value 序列化super.setHashKeySerializer(StringRedisSerializer.UTF_8);super.setHashValueSerializer(serializer);}
}

首先,继承 RedisTemplate<K,V>,泛型 K 表示 Redis Key 类型,一般都是 String,泛型 V 表示 Redis Value 类型,既然我们需要的是一个通用的 JSON Template,所以设置为 Object,Value 值可以是任意对象。

在构造函数中注入 RedisConnectionFactory 设置到父类,「这是必须的」

然后创建GenericJackson2JsonRedisSerializer 实例,它是基于 Jackson 的 RedisSerializer 实现,用于任意 Java 对象和 JSON 字符串之间的序列化/反序列化。使用该实例作为普通 Value 和 Hash Value 的序列化/反序列化器。注意,因为序列化的对象可能包含了 java.time 类型的日期字段,如:LocalTimeLocalDate 以及 LocalDateTime,所以需要注册 JavaTimeModule

创建测试类进行测试。如下:

    @GetMapping("/eee")public int www() {System.out.println("测试方法开始执行:");// MapMap<String, Object> map = new HashMap<>();map.put("name", "wtt");map.put("url", "https://*****.cn");map.put("createAt", LocalDateTime.now());jsonRedisTemplate.opsForValue().set("key1-map", map, Duration.ofMinutes(5));Map<String, Object> map2 = (Map<String, Object>) jsonRedisTemplate.opsForValue().get("key1-map");System.out.println(map2);// Hash// 设置this.jsonRedisTemplate.opsForHash().put("key2-hash", "app", map);// 读取map = (Map<String, Object>) this.jsonRedisTemplate.opsForHash().get("key2-hash", "app");log.info("map={}", map);return 0;}

我们创建了一个 Map<String, Object> 对象,存储了 2 个 String 和一个 LocalDateTime 字段。然后使用 JsonRedisTemplate 把它存储为普通 Value 和 Hash Value。

存储成功后,再进行读取,反序列化为原来的 Map<String, Object> 对象。

运行测试,执行日志如下:

测试方法开始执行:
{name=wtt, url=https://*****.cn, createAt=[2024, 5, 21, 15, 22, 40, 807000000]}
2024-05-21 15:22:41.079  INFO 7316 --- [nio-8888-exec-1] com.zcdf.school.controller.Testwtt       : map={name=wtt, url=https://*****.cn, createAt=[2024, 5, 21, 15, 22, 40, 807000000]}

我们发现,序列化为 JSON、反序列化为对象都没问题。

好文分享,一起努力加油。

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

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

相关文章

oracle正则的使用

1、建表 create table person (first_name varchar2(20),last_name varchar2(20),email varchar2(40),zip varchar2(20)); insert into PERSON (first_name, last_name, email, zip) values (Steven, Chen, stevenhp.com, 123456); insert into PERSON (first_name, last_name…

ASP+ACCESS基于B2C电子商务网站设计

摘 要 运用ASP技术结合了Access数据库原理&#xff0c;基于B/S模式我们开发了一个网上购物系统。在我们的系统中&#xff0c;顾客可以很方便的注册成为会员&#xff0c;对商品进行浏览检索&#xff0c;查看商品的详细资料&#xff0c;然后根据各人的喜好购买心仪的商品。系统…

CCF20220901——如此编码

CCF20220901——如此编码 代码如下&#xff1a; #include<bits/stdc.h> using namespace std; int main() {int n,m,cnt1,a[1000],c[1000]{1};cin>>n>>m;for(int i1;i<n;i){cin>>a[i];cnt*a[i];c[i]cnt;}int b[1000]{0};for(int i1;i<n;i)b[i](…

JPHS-JMIR Public Health and Surveillance

文章目录 一、期刊简介二、征稿信息三、期刊表现四、投稿须知五、投稿咨询 一、期刊简介 JMIR Public Health and Surveillance是一本多学科期刊&#xff0c;专注于公共卫生创新与技术的交叉领域&#xff0c;包括公共卫生信息学、监测&#xff08;监测系统和快速报告&#xff…

CCF20220601——归一化处理

CCF20220601——归一化处理 代码如下&#xff1a; #include<bits/stdc.h> using namespace std; int main() {int n,a[1000],sum0;scanf("%d",&n);for(int i1;i<n;i){scanf("%d",&a[i]);suma[i];}double aver1.0,b0.0,d1.0;aversum/(n*1…

Java基础(三)- 多线程、网络通信、单元测试、反射、注解、动态代理

多线程基础 线程&#xff1a;一个程序内部的一条执行流程&#xff0c;只有一条执行流程就是单线程 java.lang.Thread代表线程 主线程退出&#xff0c;子线程存在&#xff0c;进程不会退出 可以使用jconsole查看 创建线程 有多个方法可以创建线程 继承Thread类 优点&#x…

【学习】实验室服务器常用的Linux指令。

1. 下载GitHub代码。 使用代码&#xff1a; git clone https://github.com/Turoad/CLRNet.git2. 压缩 / 解压。 打包压缩 是日常工作中备份文件的一种方式 在不同操作系统中&#xff0c;常用的打包压缩方式是不同的选项 含义 Windows 常用 rarMac 常用 zipLinux 常用 tar.gz…

学硕都考11408的211院校!河北工业大学计算机考研考情分析!

河北工业大学&#xff08;Hebei University of Technology&#xff09;&#xff0c;简称河北工大&#xff0c;坐落于天津市&#xff0c;由河北省人民政府、天津市人民政府与中华人民共和国教育部共建&#xff0c; 隶属于河北省&#xff0c;是国家“双一流”建设高校、国家“211…

自动化测试在软件开发生命周期中如何提高代码质量?

自动化测试是一种在软件开发生命周期中使用软件工具来执行测试的方法&#xff0c;它可以大大提高代码质量&#xff0c;减少开发过程中的错误和缺陷。本文将从零开始&#xff0c;详细且规范地介绍如何使用自动化测试来提高代码质量。 第一步&#xff1a;明确测试目标 在开始自…

webgl入门-绘制三角形

绘制三角形 前言 三角形是一个最简单、最稳定的面&#xff0c;webgl 中的三维模型都是由三角面组成的。咱们这一篇就说一下三角形的绘制方法。 课堂目标 理解多点绘图原理。可以绘制三角形&#xff0c;并将其组合成多边形。 知识点 缓冲区对象点、线、面图形 第一章 web…

Python高克勒-曼宁-斯特里克勒公式计算一维流量

&#x1f4dc;曼宁公式-用例 &#x1f4dc;Python流体数据统计模型和浅水渗流平流模型模拟 | &#x1f4dc;Python蒸发散物理问题(微积分-线性代数-拉普拉斯和傅立叶变换) ✒️Python计算一维流量 高克勒-曼宁-斯特里克勒公式公式基于一维&#xff08;横截面平均&#xff09…

iPhone实况照片从Windows资源管理器复制的JPG+MOV无法正常还原到iPhone

背景&#xff1a; 之前使用的iPhone 15 Pro&#xff0c;使用的Windows资源管理器当中复制导出的实况照片&#xff0c;复制出来的格式例如IMG_0001.JPG, IMG_0001.MOV。之后手机就卖掉了。现在使用的iPhone 14 Pro Max&#xff0c;想要导回之前备份的实况照片。尝试使用爱思助手…

Java18新特性

Java 18引入了若干新特性&#xff0c;以增强语言的功能性和性能。具体如下&#xff1a; 服务提供者接口&#xff08;Service Provider Interfaces, SPI&#xff09;&#xff1a;允许开发者为Java模块系统定义服务加载机制&#xff0c;从而能够更灵活地发现和加载服务实现。简单…

supOS NEO科技普惠!永久免费!亿元补贴

数字化转型正在全球蓬勃发展&#xff0c;工业操作系统进入大规模推广期&#xff01; 如果您正在被预算不足、技术团队不强、数字化投入产出比等问题困扰&#xff0c;supOS NEO是您最好的选择。 “让supOS走进万千工厂、千行百业&#xff01;让全世界每个工厂都能用得上supOS&am…

MM模块学习三 (创建采购申请)

采购信息记录比较特殊既是主数据又是货源 注&#xff1a;发票校验是指把供应商提供的发票做到系统里面产生一张应付凭证。 1.决定采购需求 采购需求可以手工创建&#xff08;ME51N&#xff09;&#xff0c;也可以自动产生&#xff08;比如&#xff1a;MRP&#xff0c;以及比如…

Java——内部类

1.什么是内部类 在一个类的里面再定义一个类&#xff0c;新定义的这个类就是内部类 举例&#xff1a;在Outer类的里面定义一个Inter类 class Outer{class Inter{} } 在这里Outer叫外部类&#xff0c;Inter叫内部类 内部类的应用场景 定义一个汽车类&#xff1a; 属性&#xf…

CTFshow之文件上传web入门151关-161关解密。包教包会!!!!

这段时间一直在搞文件上传相关的知识&#xff0c;正好把ctf的题目做做写写给自字做个总结&#xff01; 不过有一个确定就是所有的测试全部是黑盒测试&#xff0c;无法从代码层面和大家解释&#xff0c;我找个时间把upload-labs靶场做一做给大家讲讲白盒的代码审计 一、实验准…

2024-5-23 石群电路-14

2024-5-23&#xff0c;星期四&#xff0c;22:20&#xff0c;天气&#xff1a;晴&#xff0c;心情&#xff1a;晴。今天没有什么重要的事情发生&#xff0c;心情一如既往的平静&#xff0c;距离返校假期还有两天~~~。 今天观看了石群老师电路基础课程的第23/24个视频&#xff0…

Flutter 中的 AnimatedThere 小部件:全面指南

Flutter 中的 AnimatedThere 小部件&#xff1a;全面指南 在Flutter中&#xff0c;动画是增强用户体验的强大工具。虽然Flutter没有一个名为AnimatedThere的官方小部件&#xff0c;但我们可以根据常见的动画模式来构建一个类似的自定义动画效果。本文将指导您如何使用Flutter的…

Python 安装 ONNX Runtime (ORT)

1. Python 安装 ONNX Runtime 安装cpu版的 onnx runtime&#xff1a; pip install onnxruntime 安装gpu版的 onnx runtime&#xff08;cuda 11.x&#xff09;&#xff1a;(默认安装适用于cuda 11.8 的onnx runtime) pip install onnxruntime-gpu 安装gpu版的 onnx runtime…