【开发】SpringBoot 整合 Redis

目录

前言

1. Redis 的下载及安装

1.1 Redis 的下载

1.2 安装 Redis

1.3 启动 Redis 

2. 创建 SpringBoot 项目整合 Redis

2.1 环境要求

2.2 SpringBoot项目构建

2.2.1 方式一

2.2.2 方式二

2.3 在 pom.xml 文件中导入依赖坐标

2.4 在 application.properties 中加入 Redis 相关配置

2.5 创建 pojo 包,在此包下创建 Student 实体类

2.6 创建 util 包,加载封装好的 RedisUtil.java 文件

2.7 创建 config 包,在此包下创建 RedisConfig 配置类

2.8 创建 mapper 包,编写 Mapper 接口及实现类

2.9 创建 controller 包,编写 Controller 类作业务逻辑

2.10 在 SpringbootApplication 启动类中

总结

注:手机端浏览本文章可能会出现 “目录”无法有效展示的情况,请谅解,点击侧栏目录进行跳转  


前言

        Redis 在项目开发过程中,扮演着 “缓存”、“会话存储”、“消息队列”、“数据存储”等角色,可以提示系统的性能、可扩展性和稳定性,同时还可以实现各种复杂的功能需求。下面,我对 Spring Boot 整合 Redis 作了归纳总结,供大家参考,谢谢!qwq


1. Redis 的下载及安装

1.1 Redis 的下载

相关搜索:Redis安装

1.2 安装 Redis

核心文件:

  • redis-server.exe:服务器启动命令
  • redis-cli.exe:命令行客户端
  • redis.windows.conf:redis核心配置文件
  • redis-benchmark.exe:性能测试工具
  • redis-check-aof.exe:AOF文件修复工具
  • redis-check-dump.exe:RDB文件检查工具(快照持久化文件)

1.3 启动 Redis 

服务器启动

方式一:双击 redis-server.exe

方式二:指令 redis-server.exe redis.windows.conf

客户端连接


2. 创建 SpringBoot 项目整合 Redis

2.1 环境要求

环境准备:

  1. Java:1.8.*
  2. Maven:3.6.*
  3. SpringBoot:2.*(推荐使用2.7.14)

2.2 SpringBoot项目构建

2.2.1 方式一

使用Spring Initializr的Web 页面创建项目

1. 打开https://start.spring.io/

2. 填写项目信息

3. 点击 “Generate Project”按钮生成项目;下载此项目

4. 解压项目包,并用IDEA以Maven项目导入,一直下一步即可,只到项目导入完毕

5. 如果是第一次使用,可能速度会比较慢,推荐查看Setting菜单下Maven的路径,使用国内镜像进行下载。

2.2.2 方式二

使用 IDEA 直接创建项目

1. 创建一个新项目

2. 选择 Spring initializr ,可以看到默认就是去官网的快速构建工具

3. 填写项目信息

4. 选择初始化的组件(初学勾选Web)即可

5. 填写项目路径

6. 等待项目构建成功

注:在项目构建成功后,请在 pom.xml 中查看 java的版本信息,改为自己电脑上已有的JDK版本


2.3 在 pom.xml 文件中导入依赖坐标

Redis 的启动器依赖坐标

		<!--redis依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>

说明:在 SpringBoot 2.x 之后,原来使用的 jedis 被替换位了 lettuce

jedis:采用直连,多个线程操作的话不安全,如果想要避免不安全,使用 jedis pool 连接池

lettuce:采用 netty ,实例可以在多个线程中进行共享,不存在线程不安全的情况,可以减少线程数据量

SpringBoot 的 Web 启动器依赖坐标

	    <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>

MyBatis 的启动器依赖坐标

	    <dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.0.1</version></dependency>

MySQL 的启动器依赖坐标

	    <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency>

SpringBoot 的启动器依赖坐标

	    <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>

2.4 在 application.properties 中加入 Redis 相关配置

spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/2003db?serverTimezone=GMT%2B8# 设置该包下的日志输出级别为 debug,可以输出debug级别及以上的日志信息
logging.level.com.ape.springboot_redis02.mapper=debug
#开启调试模式
debug=true# redis 数据库索引
spring.redis.database = 0
# redis 服务器的本机地址
spring.redis.host=localhost
# redis 服务器的端口号
spring.redis.port=6379
# redis 服务器连接密码(默认为空)
spring.redis.password=
# redis 连接池最大连接数(使用负值表示没有限制)
spring.redis.pool.max-active=200
# redis 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.pool.max-wait=-1
# redis 连接池的最大空闲连接
spring.redis.pool.max-idle=10
# redis 连接池中的最小空闲连接
spring.redis.pool.min-idle=0
# redis 连接超时时间(毫秒)
spring.redis.timeout=1000

2.5 创建 pojo 包,在此包下创建 Student 实体类

案例中为 学生 实体类,实现 Serializable 接口,用于后期开发中在网络上进行数据传输

public class Student implements Serializable{private Integer stuid;private String stuname;private String stuhobby;public Integer getStuid() {return stuid;}public void setStuid(Integer stuid) {this.stuid = stuid;}public String getStuname() {return stuname;}public void setStuname(String stuname) {this.stuname = stuname;}public String getStuhobby() {return stuhobby;}public void setStuhobby(String stuhobby) {this.stuhobby = stuhobby;}public Student() {}public Student(Integer stuid, String stuname, String stuhobby) {this.stuid = stuid;this.stuname = stuname;this.stuhobby = stuhobby;}
}

2.6 创建 util 包,加载封装好的 RedisUtil.java 文件

相关传送门:===》封装好的Redis 工具类《===


2.7 创建 config 包,在此包下创建 RedisConfig 配置类

@Configuration
public class RedisConfig{@Beanpublic RedisTemplate<Object, Object> jsonRedisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {RedisTemplate<Object, Object> template = new RedisTemplate<>();template.setStringSerializer(new StringRedisSerializer());//配置json类型的序列化工具template.setDefaultSerializer(new Jackson2JsonRedisSerializer(Object.class));template.setConnectionFactory(redisConnectionFactory);return template;}}

解读:

  • @Configuration 注解:标识这是一个配置类,用于定义配置元数据。
  • 定义一个 jsonRedisTemplate 的 Bean,用于返回 jsonRedisTemplate 对象。
  • jsonRedisTemplate 方法用于连接到 Redis 数据库:
    • 使用 StringRedisSerializer 作为 key 的序列化器,用于将 Redis 的 key 序列化为字符串。
    • 使用 Jaskson2JsonRedisSerializer 作为默认序列化器,用于将值序列化为 JSON 格式。
    • 将传入的 redisConnectionFactory 设置为 RedisTemplate 的连接工厂。

2.8 创建 mapper 包,编写 Mapper 接口及实现类

public interface StudentMapper {@Select("select * from Student where stuid = #{id}")public Student getStudentById(Integer id);@Delete("delete from student where stuid = #{id}")public int deleteStudentById(Integer id);
}
@Service
public class StudentService {@Autowired(required = false)StudentMapper mapper;@Autowiredpublic RedisUtil redisUtil;/*** 获取用户策略:先从缓存中获取用户,没有则取数据表中数据,再将数据写入缓存*/public Student findById(Integer id){String key = "student:id:" + id;//1.1判断key在redis中是否存在boolean hasKey = redisUtil.hasKey(key);if (hasKey) {//1.2存在缓存则直接获取Object stu = redisUtil.get(key);ObjectMapper change = new ObjectMapper();Student student =   change.convertValue(stu,Student.class);System.out.println("==========从缓存中获得数据=========");System.out.println(student.getStuname());System.out.println("==============================");return student;} else {//1.3不存在缓存,先从数据库中获取,在保存至redis,最后返回用户Student student = mapper.getStudentById(id);System.out.println("==========从数据表中获得数据=========");System.out.println(student.getStuname());System.out.println("==============================");if (student != null){redisUtil.set(key, student);//写入缓存}return student;}}/*** 删除用户策略:删除数据表中数据,然后删除缓存**/public void deleteStudentById(Integer id){//1.删除数据库int result = mapper.deleteStudentById(id);//2.判断数据库中是否删除成功String key = "student:id:" + id;if (result != 0) {//3.判断redis中是否存在boolean hasKey = redisUtil.hasKey(key);//4.存在删除,不存在直接跳转if (hasKey) {redisUtil.del(key);System.out.println("删除了缓存中的key:" + key);}}}}

2.9 创建 controller 包,编写 Controller 类作业务逻辑

@RestController
public class UserController {@AutowiredStudentService userService;@GetMapping("/findById/{id}")public Student findById(@PathVariable("id") Integer id) {Student stu = userService.findById(id);return stu;}@GetMapping("/delete/{id}")public Integer delete(@PathVariable("id") Integer id) {userService.deleteStudentById(id);return id;}}

2.10 在 SpringbootApplication 启动类中

完整代码如下

@SpringBootApplication
@MapperScan("com.ape.springboot_redis02.mapper")
public class SpringbootRedis02Application {public static void main(String[] args) {SpringApplication.run(SpringbootRedis02Application.class, args);}}

解读:

  • @SpringBootApplication 注解:标识这是一个 Spring Boot 应用程序的入口类,用于自动配置 Spring 应用程序并启动基于注解的组件扫描。
  • @MapperScan 注解:用于指定 MyBatis Mapper 接口所在的包路径,告诉 Spring 在启动时要扫描该包下的 Mapper 接口并创建对应的实现类。

总结

        在上文的案例中,我们看到了 @Component 、@Autowired等注解的出现,在此,我对这些注解的常规用法进行总结:

  1. @Component 注解:用于标识一个类为 Spring 的组件(bean),可以让 Spring 框架扫描并识别这个类,并将其实例化为一个 bean ,从而在应用程序中进行依赖注入和其他操作。
  2. @Autowired 注解:用于自动装配 Spring bean 的依赖关系。当一个类需要使用另一个类的实例时,可以在需要注入的地方使用。
  3. @Configuration 注解:用于标识一个类为配置类,定义配置元数据。
  4. @Bean 注解:用于定义 bean 的注解,告诉 Spring 容器,由该注解标注的方法返回一个对象,并交由 Spring 容器管理。
  5. @Mapper 注解:用于标注一个接口作为 MyBatis 的映射器(Mapper),使其能被 Spring 扫描并生成对应的代理对象,从而实现数据库操作的映射。
    
  6. @Service 注解:用于标识一个类为服务层组件(service bean),使其能被 Spring 扫描并实例化为一个 bean,可以在需要调用服务层逻辑的地方进行依赖注入。
  7. @RestController 注解:结合了 @Controller 和 @ResponseBody 的功能,表示这是一个控制器,并且其中的方法自动将返回值转换为 JSON 或 XML 格式的响应体。
  8. @GetMapping 注解:用于将 HTTP GET 请求映射到特定的处理方法上。可以让 Spring MVC 框架知道哪个方法来处理对应的 GET 请求。
  9. @SpringBootApplication 注解:用于标识一个 Spring Boot 应用程序的入口类。组合了多个注解 @Configuration、@EnableAutoConfiguration 和 @ComponentScan,用于自动配置 Spring 应用程序并启动基于注解的组件扫描。
  10. @MapperScan 注解:用于指定 MyBatis Mapper 接口所在的包路径,告诉 Spring 在启动时扫描该包下的 Mapper 接口并创建对应的实现类。

 

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

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

相关文章

编辑命令行提示符 prompt,支持显示 git 分支、标签等信息

实时在 Linhieng/current–Microsoft.PowerShell_profile.ps1 上更新 打开 $Profile 文件&#xff0c;将下面内容粘贴到其中即可&#xff1a; <# 负责打印 git 分支相关信息支持输出以下信息&#xff1a;当前分支&#xff0c;或者是 hash 值当前目录是否为 git 子目录当前…

定位线上最耗CPU的线程

定位线上最耗CPU的线程 准备工作 启动一个程序。 arthas-demo是一个简单的程序&#xff0c;每隔一秒生成一个随机数&#xff0c;再执行质因数分解&#xff0c;并打印出分解结果。 curl -O https://alibaba.github.io/arthas/arthas-demo.jar java -jar arthas-demo.jar[root…

计算机网络的组成

目录 <计算机网络的组成> 1.网络硬件 1)主机Host 2)终端Terminal 3)通信控制处理机 4)传输介质 5)网络连接设备 2.网络软件 1)网络操作系统 2)网络协议软件 3)网络管理软件 4)网络通信软件 5)网络应用软件 3通信子网和资源子网 <计算机网络的组成> 无…

组建公司办公网络

一 认识网络传输介质的分类 网络传输介质主要分为有线传输介质和无线传输介质两大类&#xff0c;它们在网络建设和数据传输中扮演着至关重要的角色。下面是这两类传输介质的详细分类&#xff1a; 有线传输介质 双绞线&#xff08;Twisted Pair&#xff09;&#xff1a;这是最…

PHP与Spring Boot在实现功能上的比较

原文地址&#xff1a;PHP与Spring Boot在实现功能上的比较 - Pleasure的博客 下面是正文内容&#xff1a; 前言 最近在学Spring Boot后端框架&#xff0c;在功能实现上发现了与PHP存在着一定的可比性。 这篇就单独拎出来进行比较一下。 正文 就例举一些功能上的重叠以及大致的…

【Web】浅聊Hessian反序列化之打Spring AOP——JNDI

目录 前言 简单分析 EXP 前言 前文&#xff1a;【Web】浅聊Java反序列化之Rome——关于其他利用链-CSDN博客 前文里最后给到一条HotSwappableTargetSource利用链&#xff0c;就是我们今天PartiallyComparableAdvisorHolder链子的前半段(触发恶意类的toString方法)&#xf…

Redis中的String编码转换底层原理及6.0新特性

String编码转换底层原理 String对象为什么把大于39字节或者44字节的字符串编码为raw&#xff0c;小于的时候编码为embstr? 在Redis3.2以前的版本中,SDS作为字符串类型中存储字符串内容的结构&#xff0c;源码如下&#xff1a; 3.2版本SDS结构 struct sdshdr {// 记录buf数…

华岳M9制造企业管理软件业务流程 2/4

华岳M9制造企业管理软件业务流程 2/4 步骤3 初始一、应收账款初始余额二、应付账款初始余额三、出纳账项初始余额四、会计账项初始余额五、盘点入库六、存货细目七、存货属性设置八、存货存量控制九、存货价格管理十、月末处理 步骤4 技术一、存货目录二、存货细目三、仓库绑定…

nginx代理服务器配置

nginx代理服务器配置 需要配置环境需求 1、一台1.1.1.1服务器&#xff0c;一台2.2.2.2服务器 前端包路径在1.1.1.1 /etc/dist 下 后端服务在2.2.2.2 上 暴露端口为9999 2、需求 现在需要访问 1.1.1.1:80访问到2.2.2.2 上面的9999后端服务 3、配置nginx ①&#xff1a;在…

【深度学习实践】面部表情识别,深度学习分类模型,mmpretrain用于分类的实用教程,多任务网络头

文章目录 数据集数据集的进一步处理转换training.csv转换validation.csv 剔除无法使用的图片数据选择mmpretrain框架来训练配置四个文件改写base model改写base datasetsschedulesdefault_runtime 总配置开始训练训练分析考虑在网络上增加facial_landmarks回归head考虑是否可以…

B树B+树,字典树详解,哈夫曼树博弈树

目录 B树&#xff1a;B-Tree B树 字典树&#xff1a;Trie Tree 哈夫曼树 博弈树 B树&#xff1a;B-Tree 多路平衡搜索树 1.M阶B树&#xff0c;就是M叉&#xff08;M个指针&#xff09;。 2.每个节点内记录个数<M-1。 3.根节点记录个数>1。 4.其余节点内记录个数&…

人工智能技术的不当利用与风险

目录 前言1 视频篡改技术的滥用1.1 虚假信息传播与社会动荡1.2 对公众信任的破坏与舆论混乱 2 隐私泄露与监视风险2.1 个人信息安全与数据滥用风险2.2 社会稳定与个人自由权利的平衡 3 虚假评论与信息传播3.1 舆论操纵与社会意识形态的影响3.2 对信息可信度与公众信任的威胁 结…

Mysql迁移至达梦所遇问题汇总

问题与解决&#xff1a; 1: 建表语句中不允许出现类似如下语句&#xff1a; create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMPKEY member_id (member_id) USING BTREE 2: SQL 错误 [22000]: 仅当指定列列表&#xff0c;且SET IDENTIT…

红与黑(bfs, acwing)

题目描述&#xff1a; 有一间长方形的房子&#xff0c;地上铺了红色、黑色两种颜色的正方形瓷砖。 你站在其中一块黑色的瓷砖上&#xff0c;只能向相邻&#xff08;上下左右四个方向&#xff09;的黑色瓷砖移动。 请写一个程序&#xff0c;计算你总共能够到达多少块黑色的瓷…

03 龙芯平台openstack部署搭建-keystone部署

#!/bin/bash #创建keystone数据库并授权&#xff0c;可通过mysql -ukeystone -ploongson验证授权登录 mysql -uroot -e “set password for rootlocalhost password(‘loongson’);” mysql -uroot -ploongson -e ‘CREATE DATABASE keystone;’ #本地登录 mysql -uroot -ploo…

【Linux】进程---概念---进程---优先级

主页&#xff1a;醋溜马桶圈-CSDN博客 专栏&#xff1a;Linux_醋溜马桶圈的博客-CSDN博客 gitee&#xff1a;mnxcc (mnxcc) - Gitee.com 目录 1.操作系统(Operator System) 1.1 概念 1.2 设计OS的目的 1.3 定位 1.4 如何理解 "管理" 1.5 总结 1.6 系统调用和…

蓝桥杯刷题总结(Python组)

1、蛇形矩阵 解题思路&#xff1a;每次赋值后都对方向进行改变&#xff0c;一般上下左右就是&#xff08;-1&#xff0c;0&#xff09;&#xff0c;&#xff08;0&#xff0c;1&#xff09;&#xff0c;&#xff08;1&#xff0c;0&#xff09;&#xff0c;&#xff08;0&…

智慧城市物联网建设:提升城市管理效率与居民生活品质

目录 一、智慧城市物联网建设的意义 1、提升城市管理效率 2、改善居民生活品质 3、促进城市可持续发展 二、智慧城市物联网建设面临的挑战 1、技术标准与互操作性问题 2、数据安全与隐私保护问题 3、投资与回报平衡问题 三、智慧城市物联网建设的实施策略 1、制定统一…

Linux下安装多个nodejs并映射Jenkins

背景 需要Jenkins中切换多个Node&#xff0c;比如nodejs16和nodesjs18,所以在宿主机按照好这两个版本&#xff0c;然后再映射到Jenkins容器中 步骤 1.下载地址 https://nodejs.org/dist/ 放到 cd /opt/soft/2.解压 tar -xzvf node-v16.20.0-linux-x64.tar.gz tar -xzvf n…

STM32F4+薄膜压力传感器(FSR)AO模拟输出程序ADC模数转换器详解

前言&#xff1a;博主在使用STM32F4加薄膜压力传感器用来测量压力时&#xff0c;发现给的例程只有STM32F1系列的&#xff0c;而STM32F4系列库函数程序不太一致&#xff0c;博主实战解决了该问题&#xff0c;用STM32F4标准库开发。有关ADC模数转换器的详细知识点详情点击我的博文…