SpringBoot : ch09 整合Redis

前言

当你的应用程序需要一个快速、可扩展的内存数据库时,Redis是一个非常流行的选择。通过将Redis与Spring Boot集成,你可以轻松地利用Redis的功能,例如缓存、会话存储和消息队列等,从而提升应用程序的性能和可伸缩性。

在本教程中,我们将深入探讨如何在Spring Boot项目中整合Redis。我们将学习如何配置Redis连接、使用Spring Data Redis来进行数据访问操作,以及如何利用Redis作为缓存来提高应用程序的效率。无论你是刚刚接触Spring Boot还是已经有一定经验,这篇教程都将为你展示如何利用Redis为你的应用程序增添强大的功能。

通过本教程的学习,你将对Spring Boot与Redis的整合有一个清晰的理解,并能够在实际项目中应用这些知识。让我们一起开始,探索Spring Boot与Redis这个强大组合带来的无限可能吧!

一、前期准备

1、新建项目,结构如下

2、导入依赖
    <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><!-- 使用 jackson 序列化器,需要依赖JACKSON包 --><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>11</source><target>11</target><encoding>UTF-8</encoding></configuration></plugin><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>${spring-boot.version}</version><configuration><mainClass>edu.nf.ch09.Ch09Application</mainClass><skip>true</skip></configuration><executions><execution><id>repackage</id><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins></build>

这段代码是一个基于Spring Boot的项目的pom.xml文件,其中包含了该项目的依赖管理和构建配置。

  1. 依赖:

    • spring-boot-starter-data-redis:这是Spring Boot提供的用于集成Redis的starter,可以方便地进行Redis数据库访问。
    • jackson-databind:这是Jackson库的核心依赖,用于实现Java对象与JSON之间的序列化和反序列化操作。
    • spring-boot-starter-test:这是Spring Boot提供的用于单元测试的starter,包含了常用的测试框架和工具。
    • lombok:这是一个Java库,用于简化Java代码的编写。它提供了一些注解(如@Data@Getter@Setter等),可以自动生成getter、setter方法等。
  2. 依赖管理:

    • spring-boot-dependencies:这是Spring Boot提供的依赖管理BOM(Bill of Materials)文件,用于管理项目中使用的Spring Boot相关依赖的版本。
  3. 构建配置:

    • maven-compiler-plugin:这是Maven的编译插件,用于配置项目的编译选项。在这里,设置了Java的源码版本和目标版本为11,并指定了编码格式为UTF-8。
    • spring-boot-maven-plugin:这是Spring Boot的Maven插件,用于支持将Spring Boot应用程序打包成可执行的JAR文件。在这里,配置了主类的名称和打包方式为repackage

通过以上的配置,可以管理项目的依赖关系,并使用Maven进行项目的构建和打包操作。同时,该项目还集成了Spring Boot、Redis和Lombok等技术,以便开发和测试Spring Boot应用程序。

 

二、配置 RedisConfig 配置类


@Configuration
public class RedisConfig {/*** 自定义 RedisTemplate* @param connectionFactory* @return*/@Beanpublic RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory connectionFactory){RedisTemplate<String,Object> template = new RedisTemplate<>();template.setConnectionFactory(connectionFactory);// 设置 key 的序列化器template.setKeySerializer(RedisSerializer.string());template.setHashKeySerializer(RedisSerializer.string());// 设置 value 的序列化器template.setValueSerializer(RedisSerializer.json());template.setHashValueSerializer(RedisSerializer.json());return template;}}

这段代码是一个自定义RedisTemplate的配置类。在Spring Boot中,可以通过自定义配置类来创建和配置自定义的Bean。

首先,使用@Configuration注解标识该类是一个配置类,Spring Boot会在启动时加载并应用该配置。

然后,在redisTemplate()方法上使用@Bean注解,表示将该方法返回的对象注册为一个Bean,并由Spring容器进行管理。

redisTemplate()方法中,通过参数RedisConnectionFactory获取到Redis连接工厂,作为创建RedisTemplate的参数。

接着,创建一个RedisTemplate对象,并将连接工厂设置为其连接工厂。

然后,通过调用setKeySerializer()setValueSerializer()方法,分别设置key和value的序列化器。在这里,使用了RedisSerializer的静态方法string()json()来获取String和JSON的序列化器。

最后,返回创建的RedisTemplate对象。

通过自定义RedisConfig类,可以创建一个自定义的RedisTemplate,并对其进行相关配置,例如设置序列化器等。在其他需要使用RedisTemplate的地方,可以直接注入该Bean来进行操作。

需要注意的是,为了让Spring Boot能够正确识别和加载自定义RedisTemplate,需要将RedisConfig类所在的包路径包含在@ComponentScan或@SpringBootApplication注解中。或者将RedisConfig类放在主配置类(如Application类)所在的子包下,这样可以自动扫描到该配置类。

三、配置 yml 

spring:# 配置 redis 配置redis:# 指定使用第几个数据库database: 0# 主机地址host: 127.0.0.1# 端口号port: 6379# 指定超时时间timeout: 2000

这段配置是用来配置Spring Boot应用程序连接Redis的相关参数。

在配置文件中,以spring.redis为前缀,可以设置以下参数:

  • database:指定要使用的Redis数据库,默认为0。如果应用程序需要访问多个数据库,可以通过修改此值来切换数据库。

  • host:指定Redis服务器的主机地址。在这里,设置为127.0.0.1表示本地主机。

  • port:指定Redis服务器的端口号。默认情况下,Redis服务器使用6379作为默认端口。

  • timeout:指定连接到Redis服务器的超时时间,单位为毫秒。如果连接在指定的时间内没有响应,将会抛出连接超时异常。

通过在配置文件中设置这些参数,应用程序将会使用指定的主机地址、端口号和超时时间来连接到Redis服务器。这样,在应用程序中就可以直接使用自动装配的RedisTemplate进行操作。

需要注意的是,配置文件的格式可能会根据不同的配置方式而有所差异。上述示例是使用YAML格式的配置文件,如果你使用的是其他格式的配置文件,可能需要做相应的调整。

四、新建一个 User 实体类


@Data
@AllArgsConstructor
@NoArgsConstructor
public class User implements Serializable {private Integer id;private String userName;}

这段代码定义了一个User类,该类具有以下特点:

  • 使用了@Data注解,它是Lombok库提供的一个注解,用于自动生成getter、setter、toString、equals、hashCode等常用方法。

  • 使用了@AllArgsConstructor注解,它是Lombok库提供的一个注解,用于生成一个包含所有参数的构造函数。

  • 使用了@NoArgsConstructor注解,它是Lombok库提供的一个注解,用于生成一个无参构造函数。

  • 实现了Serializable接口,表示该类可以在网络中进行传输或在磁盘上进行存储,这通常用于对象的序列化和反序列化操作。

该User类有两个属性:

  • id:表示用户的ID,类型为Integer。

  • userName:表示用户名,类型为String。

通过使用Lombok库提供的注解,可以简化Java类的编写,自动生成常用的方法和构造函数,减少了冗余的代码。同时,实现Serializable接口可以让User类的对象在不同的环境中进行传输和持久化存储。

 五、操作 redis

1、返回 String

@Service
@RequiredArgsConstructor
public class UserService {/*** 默认装配的是 StringRedisTemplate ,用于操作字符串*/private final StringRedisTemplate template;/*** key 的前缀*/private final static String PREFIX = "user:";/*** 返回 String* @param id* @return*/public String getUser(Integer id){if (!template.hasKey(PREFIX + id)){// 保存到 Redistemplate.opsForValue().set(PREFIX + id,"user1");// 设置过期时间template.expire(PREFIX + id,1800, TimeUnit.MINUTES);}return template.opsForValue().get(PREFIX + id);}}

这段代码定义了一个名为UserService的服务类,其中包含以下方法:

  • getUser(Integer id):该方法接受一个参数id,表示要获取用户信息的ID。如果Redis中存在该用户的信息,则直接从Redis中获取并返回;否则,将用户信息保存到Redis中,并设置过期时间为30分钟,最后再返回用户信息。

在该服务类中使用了@Service注解,表示将该类标记为一个服务类,并由Spring容器进行管理。

在构造函数上使用了@RequiredArgsConstructor注解,它是Lombok库提供的一个注解,用于生成一个包含所有final成员变量的构造函数,并自动进行依赖注入。在这里,使用了StringRedisTemplate类的实例作为依赖注入的参数,表示将其注入到UserService类中。

在getUser()方法中,首先判断Redis中是否存在指定的key,如果不存在则将用户信息保存到Redis中,并设置过期时间为30分钟。最后,从Redis中获取用户信息并返回。

通过将业务逻辑封装在服务类中,可以使得业务逻辑与具体的实现细节解耦,方便进行单元测试和维护。同时,使用StringRedisTemplate类来操作Redis,可以简化对Redis的操作,提高开发效率。 

2、返回一个对象
@Service
@RequiredArgsConstructor
public class UserService {private final RedisTemplate<String, Object> template;/*** key 的前缀*/private final static String PREFIX = "user:";/*** 返回 对象* @param id* @return*/public User getUser(Integer id){if (!template.hasKey(PREFIX + id)){User user = new User(id,"qiu");// 保存到 Redistemplate.opsForValue().set(PREFIX + id,user);// 设置过期时间template.expire(PREFIX + id,1800, TimeUnit.SECONDS);}return (User) template.opsForValue().get(PREFIX + id);}}

解释如下:

  • @Service注解表示这是一个Spring的服务组件,用于处理业务逻辑。
  • @RequiredArgsConstructor注解是Lombok库提供的注解,用于生成带有必需参数的构造函数。
  • RedisTemplate<String, Object>是一个用于操作Redis的模板类,其中String表示Redis的key的类型,Object表示Redis的value的类型。
  • PREFIX是一个常量,用于设置Redis中存储用户对象的key的前缀。
  • getUser()方法用于获取用户对象。首先,它会检查Redis中是否存在指定key,如果不存在,则创建一个新的User对象,并将其保存到Redis中。同时,还设置了该key的过期时间为1800秒。最后,通过模板类的opsForValue().get()方法从Redis中获取用户对象并返回。

通过使用这个UserService类,你可以在获取用户对象时先尝试从Redis缓存中获取,如果缓存中不存在,则去数据库中查询,并将结果存入Redis缓存,以提高查询性能和减轻数据库负载。

3、测试
1)返回字符串
 @Testvoid contextLoads() {String user = service.getUser(1000);log.info(user);}

 运行结果:

2)返回对象
 @Testvoid contextLoads() {User user = service.getUser(2);log.info(user.getUserName());}

 运行结果:

 

六、SpringBoot 整合 Redis 的好处? 

Spring Boot 整合 Redis 有以下几个好处:

  1. 缓存支持:Redis 是一种高性能的缓存数据库,通过将数据存储在 Redis 中,可以大大提高系统的读取性能。Spring Boot 提供了对 Redis 的无缝集成,可以方便地使用 Redis 作为缓存存储。

  2. 分布式锁支持:在分布式系统中,为了保证数据的一致性和避免并发冲突,常常需要使用分布式锁。Redis 提供了原子操作和特定数据结构(如 Redisson)来实现分布式锁。通过 Spring Boot 整合 Redis,可以方便地使用 Redis 实现分布式锁,确保多个节点之间的数据访问的互斥性。

  3. 会话管理支持:在 Web 应用程序中,会话管理是非常重要的功能。通过 Spring Session 和 Redis 结合使用,可以将会话数据存储在 Redis 中,实现分布式环境下的会话共享,提高系统的可伸缩性和稳定性。

  4. 发布/订阅支持:Redis 提供了发布/订阅模式,可以实现消息的广播和订阅。通过 Spring Boot 整合 Redis,可以方便地使用 Redis 的发布/订阅功能,实现消息的异步通信和事件驱动。

  5. 数据持久化支持:除了作为缓存数据库,Redis 还可以作为持久化存储数据库使用。通过 Spring Boot 整合 Redis,可以方便地将数据持久化到 Redis 中,并进行读取和查询。

综上所述,Spring Boot 整合 Redis 可以提供缓存支持、分布式锁支持、会话管理支持、发布/订阅支持和数据持久化支持,增强了系统的性能、可伸缩性和稳定性,使开发人员可以更方便地利用 Redis 提供的功能和特性。

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

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

相关文章

mongodb查询数据库集合的基础命令

基础命令 启动mongo服务 mongod -f /usr/local/mongodb/mongod.conf //注意配置文件路径停止mongo服务 关闭mongodb有三种方式&#xff1a; 一种是进入mongo后通过mongo的函数关闭&#xff1b; use admin db.shutdownServer()一种是通过mongod关闭&#xff1b; mongod --s…

Selenium 学习(0.14)——软件测试之测试用例设计方法——因果图法2【基本步骤及案例】

1、因果图法的基本步骤 2、案例分析 1&#xff09;分析原因和结果 2&#xff09;关联原因和结果 投入1元5角或2元&#xff0c;按下“可乐”&#xff0c;送出“可乐”【暂时忽略找零】 投入2元&#xff0c;按下“可乐”或“雪碧”。找零5角&#xff0c;送出“可乐”或“雪…

软件测试测试文档编写

在软件测试中的流程中&#xff0c;测试文档也是一个重要的流程&#xff0c;所以测试人员也需要学习测试文档的编写和阅读。 一、定义&#xff1a;   测试文档&#xff08;Testing Documentation&#xff09;记录和描述了整个测试流程&#xff0c;它是整个测试活动中非常重要…

vscode注释插件「koroFileHeader」

前言 在vscode上进行前端开发&#xff0c;有几个流行的注释插件&#xff1a; Better CommentsTodo TreekoroFileHeaderDocument ThisAuto Comment Blocks 在上面的插件中我选择 koroFileHeader 做推荐&#xff0c;原因一是使用人数比较多&#xff08;最多的是 Better Commen…

NAS-DIP: Learning Deep Image Prior with Neural Architecture Search

NAS-DIP: 用神经结构搜索学习深度图像先验 论文链接&#xff1a;https://arxiv.org/abs/2008.11713 项目链接&#xff1a;https://github.com/YunChunChen/NAS-DIP-pytorch Abstract 最近的研究表明&#xff0c;深度卷积神经网络的结构可以用作解决各种逆图像恢复任务的结构…

使用vue脚手架创建vue项目

Vue是一个流行的前端框架&#xff0c;可以用简洁的语法和组件化的思想开发单页面应用。Vue脚手架是一个官方提供的命令行工具&#xff0c;它可以帮你快速搭建和配置vue项目的基本结构和依赖。 本文介绍如何使用vue脚手架创建一个vue2项目&#xff0c;并选择一些常用的功能和插件…

Java开源ETL工具-Kettle

一、背景 公司有个基于Kettle二次开发产品主要定位是做一些数据ETL的工作, 所谓的ETL就是针对数据进行抽取、转换以及加载的过程&#xff0c;说白了就是怎么对原始数据进行清洗&#xff0c;最后拿到我们需要的、符合规范的、有价值的数据进行存储或者分析的过程。 一般处理ETL的…

【从浅识到熟知Linux】基本指令之man、uname和bc

&#x1f388;归属专栏&#xff1a;从浅学到熟知Linux &#x1f697;个人主页&#xff1a;Jammingpro &#x1f41f;每日一句&#xff1a;干完饭写篇博客放松一下。 文章前言&#xff1a;本文介绍man、uname和bc指令用法并给出示例和截图。 文章目录 man基本语法功能选项无选项…

人工智能入门,什么是AlphaGo式搜索?

AlphaGo式搜索是一种搜索算法&#xff0c;它是由DeepMind开发的AlphaGo团队在开发AlphaGo程序时使用的搜索策略。 AlphaGo是一个基于人工智能的围棋程序&#xff0c;它在2016年击败了世界冠军柯洁&#xff0c;引起了广泛的关注。 AlphaGo式搜索的核心思想是使用蒙特卡洛树搜索…

Docker:深入解析Nexus技术构建可靠的软件仓库管理系统

1、简述 在现代软件开发中&#xff0c;有效的软件仓库管理是确保项目成功的关键一环。Nexus Repository Manager作为一种流行的仓库管理系统&#xff0c;为开发人员提供了强大的工具&#xff0c;用于存储、检索和管理软件构建。本文将深入解析Nexus技术&#xff0c;探讨其关键…

OMP: Error #15: Initializing libiomp5md.dll

问题描述 在conda虚拟环境运行程序时&#xff0c;出现以下的错误&#xff1a; 问题原因 anaconda的环境下存在两个libiomp5md.dll文件。 解决方法 一、在代码上加上限制&#xff08;每次都得加&#xff09; import os os.environ[KMP_DUPLICATE_LIB_OK]True 这种方法解决不…

【蓝桥杯选拔赛真题26】C++字符串逆序 第十三届蓝桥杯青少年创意编程大赛C++编程选拔赛真题解析

目录 C/C++字符串逆序 一、题目要求 1、编程实现 2、输入输出 二、算法分析

Charles下载安装及配置之Mac

因工作需要用到抓包工具&#xff0c;但Fiddler不能在mac上使用&#xff0c;所以找到了Charles&#xff0c;Charles其实是一款代理服务器&#xff0c;通过过将自己设置成系统&#xff08;电脑或者浏览器&#xff09;的网络访问代理服务器&#xff0c;然后截取请求和请求结果达到…

sql注入靶场

第一关&#xff1a; 输入&#xff1a;http://127.0.0.1/sqli-labs-master/Less-1/?id1 http://127.0.0.1/sqli-labs-master/Less-1/?id1%27 http://127.0.0.1/sqli-labs-master/Less-1/?id1%27-- 使用--来闭合单引号&#xff0c;证明此处存在字符型的SQL注入。 使用order …

Unity之NetCode多人网络游戏联机对战教程(10)--玩家动画同步

文章目录 前言NetworkAnimation服务端权威客户端权威 前言 这次的动画同步与位置同步&#xff0c;可以说实现思路是一样的&#xff0c;代码相似度也非常高 NetworkAnimation 如果直接挂载这个脚本只有Host&#xff08;服务端&#xff09;才可以同步&#xff0c;Client是没有…

通过火狐Firefox浏览器在设备间留言、传递备注消息

如果多台设备间没有都安装微信、飞书这种可以通过文件传输助手备注消息的APP&#xff0c;那么可通过火狐浏览器在设备间留言。 原理&#xff1a;火狐支持把当前设备的一个浏览器标签页发送到其他设备 那么我们只需要把要留言的文本记录到一个网页&#xff0c;然后发送到其他设…

快速开发出一个公司网站

问题描述&#xff1a;参加一个创业活动&#xff0c;小组要求做一个公司网站&#xff0c;简单介绍一下自己公司的业务。需要快速完成。 问题解决&#xff1a;从网上找一个网站模板&#xff0c;类似于做PPT&#xff0c;搭建一个网站即可。 这里推荐的是京美建站、wordpress、he…

springboot云HIS医院信息综合管理平台源码

满足基层医院机构各类业务需要的健康云HIS系统。该系统能帮助基层医院机构完成日常各类业务&#xff0c;提供病患挂号支持、病患问诊、电子病历、开药发药、会员管理、统计查询、医生站和护士站等一系列常规功能&#xff0c;能与公卫、PACS等各类外部系统融合&#xff0c;实现多…

常见加密算法

常见加密算法 加密算法是一种用数学方法对数据进行变换的技术&#xff0c;目的是保护数据的安全&#xff0c;防止被未经授权的人读取或修改。加密算法可以分为三大类&#xff1a;对称加密算法、非对称加密算法和哈希算法&#xff08;也叫摘要算法&#xff09;。 哈希算法 哈…

来自2023 TM Forum 数字领导力中国峰会的邀请函

峰会介绍 2023数字领导力中国峰会由tmforum和亚信科技联合主办。 数据驱动创新&#xff0c;数字塑造未来&#xff01;2023数字领导力中国峰会&#xff0c;立足技术和商业视角&#xff0c;聚焦讨论各行业如何依托数据治理、IT和网络转型&#xff0c;实现跨越式增长。 这里&am…