【Redis系列】Spring Boot 集成 Redis 实现缓存功能
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
- 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老
- 导航
- 檀越剑指大厂系列:全面总结 java 核心技术点,如集合,jvm,并发编程 redis,kafka,Spring,微服务,Netty 等
- 常用开发工具系列:罗列常用的开发工具,如 IDEA,Mac,Alfred,electerm,Git,typora,apifox 等
- 数据库系列:详细总结了常用数据库 mysql 技术点,以及工作中遇到的 mysql 问题等
- 懒人运维系列:总结好用的命令,解放双手不香吗?能用一个命令完成绝不用两个操作
- 数据结构与算法系列:总结数据结构和算法,不同类型针对性训练,提升编程思维,剑指大厂
非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨
博客目录
- 一、配置 Redis 连接
- 二、使用 Jedis 操作 Redis
- 三、使用 RedisTemplate 操作 Redis
摘要:本文介绍了如何在 Spring Boot 项目中集成 Redis,并利用 Redis 实现缓存功能。文章包括配置 Redis 连接、使用 Jedis 和 RedisTemplate 两种方式进行操作的示例代码,并探讨了它们的优缺点。
随着互联网应用的不断发展,对于数据的高效读写和缓存处理变得越来越重要。而 Redis 作为一款高性能的缓存数据库,被广泛应用于各种大型系统中。本文将介绍如何在 Spring Boot 项目中集成 Redis,并利用 Redis 实现缓存功能。

一、配置 Redis 连接
在 Spring Boot 项目中,我们可以通过配置文件来指定 Redis 的连接参数。以 YAML 格式的配置文件为例,示例如下:
spring:redis:database: 3password: xxxxtimeout: 60000 #连接超时host: 10.xxx.14.40port: 6379jedis:pool:max-idle: 6 #最大空闲数max-active: 100 #最大连接数min-idle: 2 #最小空闲数
以上配置了 Redis 的数据库编号、密码、连接超时时间以及连接池的相关参数。
二、使用 Jedis 操作 Redis
Jedis 是 Java 操作 Redis 的一款常用客户端库。下面是使用 Jedis 进行操作的示例代码。
首先,我们需要创建一个 JedisConfig 类,用于配置 Jedis 连接池:
@Slf4j
@Configuration
public class JedisConfig {@Value("${spring.redis.host}")private String host;@Value("${spring.redis.port}")private int port;@Value("${spring.redis.timeout}")private Integer timeout;@Value("${spring.redis.password}")private String password;@Value("${spring.redis.database}")private Integer database;@Value("${spring.redis.jedis.pool.max-active}")private int maxActive;@Value("${spring.redis.jedis.pool.max-idle}")private int maxIdle;@Value("${spring.redis.jedis.pool.min-idle}")private int minIdle;@Beanpublic JedisPool jedisPool() {JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();jedisPoolConfig.setMaxIdle(maxIdle);jedisPoolConfig.setMinIdle(minIdle);jedisPoolConfig.setMaxTotal(maxActive);JedisPool jedisPool = new JedisPool(jedisPoolConfig, host, port, timeout, "default", password, database);log.info("JedisPool Connection Success:" + host + "\t" + port);return jedisPool;}
}
在上述代码中,我们通过@Configuration 注解将 JedisConfig 类标识为配置类,并通过@Bean 注解将 jedisPool 方法返回的 JedisPool 对象注册为 Spring 的 Bean。
接下来,我们可以创建一个 JedisUtils 类,用于获取 Jedis 资源和释放连接:
@Component
public class JedisUtils {@Autowiredprivate JedisPool jedisPool;/*** 获取Jedis资源*/public Jedis getJedis() {return jedisPool.getResource();}/*** 释放Jedis连接*/public void close(Jedis jedis) {if (jedis != null) {jedis.close();}}
}
在上述代码中,我们通过@Autowired 注解将 JedisPool 对象注入到 JedisUtils 类中。通过调用 getJedis 方法,我们可以获取一个 Jedis 资源对象,用于后续的操作。在完成操作后,调用 close 方法释放 Jedis 连接,以便连接可以被连接池重复利用。
接下来,我们可以创建一个 JedisClient 类,用于具体的操作 Redis:
@Slf4j
@Component
public class JedisClient {@Autowiredprivate JedisUtils jedisUtils;/*** 根据key查询value值*/public String get(String key) {Jedis jedis = jedisUtils.getJedis();try {if (!jedis.exists(key)) {log.info("key:{}在Redis中查不到数据.", key);} else {return jedis.get(key);}} catch (Exception e) {log.error("Jedis get操作出错", e);} finally {jedisUtils.close(jedis);}return null;}/*** 设置key-value*/public void set(String key, String value) {Jedis jedis = jedisUtils.getJedis();try {jedis.set(key, value);} catch (Exception e) {log.error("Jedis set操作出错", e);} finally {jedisUtils.close(jedis);}}/*** 删除key*/public void delete(String key) {Jedis jedis = jedisUtils.getJedis();try {jedis.del(key);} catch (Exception e) {log.error("Jedis delete操作出错", e);} finally {jedisUtils.close(jedis);}}
}
在上述代码中,我们通过@Autowired 注解将 JedisUtils 对象注入到 JedisClient 类中,以获取 Jedis 资源。然后,我们可以定义一些常见的 Redis 操作方法,例如 get、set 和 delete。
最后,我们可以在需要使用缓存的地方调用 JedisClient 类进行 Redis 操作。例如:
@RestController
public class UserController {@Autowiredprivate JedisClient jedisClient;@GetMapping("/user/{id}")public User getUserById(@PathVariable("id") String id) {String key = "user:" + id;String value = jedisClient.get(key);if (value != null) {return JSON.parseObject(value, User.class);} else {User user = userService.getUserById(id);if (user != null) {jedisClient.set(key, JSON.toJSONString(user));}return user;}}
}
在上述代码中,我们首先根据缓存的 key 值查询 Redis 中是否存在对应的 value 值。如果存在,则直接从 Redis 中获取缓存数据。如果不存在,则从数据库中获取数据,并将数据存入 Redis 中以供下次使用。
三、使用 RedisTemplate 操作 Redis
除了使用 Jedis 进行 Redis 操作外,Spring Boot 还提供了另一种方式:使用 RedisTemplate。下面是使用 RedisTemplate 进行操作的示例代码。

首先,我们需要创建一个 RedisConfig 类,用于配置 RedisTemplate:
@Configuration
public class RedisConfig {@Value("${spring.redis.host}")private String host;@Value("${spring.redis.port}")private int port;@Value("${spring.redis.timeout}")private Integer timeout;@Value("${spring.redis.password}")private String password;@Value("${spring.redis.database}")private Integer database;@Beanpublic RedisConnectionFactory redisConnectionFactory() {RedisStandaloneConfiguration config = new RedisStandaloneConfiguration(host, port);config.setDatabase(database);config.setPassword(RedisPassword.of(password));LettuceConnectionFactory connectionFactory = new LettuceConnectionFactory(config);connectionFactory.setTimeout(timeout);return connectionFactory;}@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();redisTemplate.setConnectionFactory(connectionFactory);// 设置key和value的序列化方式redisTemplate.setKeySerializer(new StringRedisSerializer());redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());return redisTemplate;}
}
在上述代码中,我们通过@Configuration 注解将 RedisConfig 类标识为配置类,并通过@Bean 注解分别注册了 redisConnectionFactory 和 redisTemplate 对象。在 redisTemplate 方法中,我们设置了 key 和 value 的序列化方式,这里使用了 StringRedisSerializer 和 GenericJackson2JsonRedisSerializer。
接下来,我们可以在需要使用缓存的地方注入 RedisTemplate 对象,并调用相应的方法进行 Redis 操作。例如:
@RestController
public class UserController {@Autowiredprivate RedisTemplate<String, Object> redisTemplate;@GetMapping("/user/{id}")public User getUserById(@PathVariable("id") String id) {String key = "user:" + id;User user = (User) redisTemplate.opsForValue().get(key);if (user != null) {return user;} else {user = userService.getUserById(id);if (user != null) {redisTemplate.opsForValue().set(key, user);}return user;}}
}
在上述代码中,我们通过 RedisTemplate 的 opsForValue 方法获取 ValueOperations 对象,并调用 get 方法从 Redis 中获取缓存数据。如果数据不存在,则从数据库中
觉得有用的话点个赞
👍🏻呗。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍
🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙
相关文章:
【Redis系列】Spring Boot 集成 Redis 实现缓存功能
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
Flutter之Flex组件布局
目录 Flex属性值 轴向:direction:Axis.horizontal 主轴方向:mainAxisAlignment:MainAxisAlignment.center 交叉轴方向:crossAxisAlignment:CrossAxisAlignment 主轴尺寸:mainAxisSize 文字方向:textDirection:TextDirection 竖直方向排序:verticalDirection:VerticalDir…...
【Linux】TCP编程{socket/listen/accept/telnet/connect/send}
文章目录 1.TCP接口1.1socket文档 1.2listen拓:端口号8080 1.3accept拓:今天全局函数 1.4读写接口1.5telnet1.一个客户端2.两个客户端 1.6ulimit -a1.7常识回顾1.8connect1.9拓:客户端的ip和地址什么时候被分配?1.10拓:…...
【WPF应用33】WPF基本控件-TabControl的详解与示例
在Windows Presentation Foundation(WPF)中,TabControl控件是一个强大的界面元素,它允许用户在多个标签页之间切换,每个标签页都可以显示不同的内容。这种控件在组织信息、提供选项卡式界面等方面非常有用。在本篇博客…...
[C语言]——动态内存管理
目录 一.为什么要有动态内存分配 二.malloc和free 1.malloc 2.free 三.calloc和realloc 1.calloc 2.realloc 3.空间的释放编辑 四.常见的动态内存的错误 1.对NULL指针的解引用操作 2.对动态开辟空间的越界访问 3.对非动态开辟内存使用free释放 4.使用free释放⼀块…...
C++ 学习笔记
文章目录 【 字符串相关 】C 输入输出流strcpy_s() 字符串复制输出乱码 【 STL 】各个 STL 支持的常见方法 ? : 运算符switch case 运算符 switch(expression) {case constant-expression :statement(s);break; // 可选的case constant-expression :statement(s);break; //…...
本科生学深度学习一残差网络,解决梯度消失和爆炸
看到订阅的激励还在继续,今天写下残差网络 1、梯度爆炸和梯度消失 梯度爆炸和梯度消失是两种常见的问题,由神经网络的结构和参数初始化方式引起。它们都与深度神经网络中的反向传播过程相关。 梯度爆炸:这是指在反向传播期间,梯度逐渐增大并最终超出了有效范围。这通常发…...
初识SpringMVC
一、什么是MVC MVC是一种软件架构模式(是一种软件架构设计思想,不止Java开发中用到,其它语言也需要用到),它将应用分为三块: M:Model(模型)V:View(…...
【Leetcode】2009. 使数组连续的最少操作数
文章目录 题目思路代码复杂度分析时间复杂度空间复杂度 结果总结 题目 题目链接🔗 给你一个整数数组 n u m s nums nums 。每一次操作中,你可以将 n u m s nums nums 中 任意 一个元素替换成 任意 整数。 如果 n u m s nums nums 满足以下条件&…...
LeetCode-347. 前 K 个高频元素【数组 哈希表 分治 桶排序 计数 快速选择 排序 堆(优先队列)】
LeetCode-347. 前 K 个高频元素【数组 哈希表 分治 桶排序 计数 快速选择 排序 堆(优先队列)】 题目描述:解题思路一:哈希表记录出现次数,然后用最小堆取,因为每次都是弹出最小的,剩下的一定是K…...
K8S Deployment HA
文章目录 K8S Deployment HA1.机器规划2.前期准备2.1 安装ansible2.2 修改 hostname2.3 配置免密2.4 时间同步2.5 系统参数调整2.6 安装 Docker2.7 部署 HaproxyKeepalived 3. 部署 K8S3.1 安装 k8s命令3.2 k8s初始化3.3 添加其他master节点3.4 添加 Node节点3.5 安装 CNI3.6 查…...
【Linux】linux 在指定根目录下,查找wav文件并删除
要在Linux的指定根目录下查找.wav文件并删除它们,您可以使用find命令结合-exec选项来执行删除操作。请注意,这个操作是不可逆的,所以在执行之前请确保您知道自己在做什么,并且已经备份了重要数据。 以下是一个示例命令࿰…...
三、SpringBoot3 整合 SpringMVC
本章概要 实现过程web 相关配置静态资源处理自定义拦截器(SpringMVC 配置) 3.1 实现过程 创建程序引入依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www…...
设计模式之解释器模式(上)
解释器模式 1)概述 1.定义 定义一个语言的文法,并且建立一个解释器来解释该语言中的句子,这里的“语言”是指使用规定格式和语法的代码。 2.结构图 3.角色 AbstractExpression(抽象表达式):在抽象表达…...
[23年蓝桥杯] 买二赠一
题目描述 【问题描述】 某商场有 N 件商品,其中第 i 件的价格是 A i 。现在该商场正在进行 “ 买二 赠一” 的优惠活动,具体规则是: 每购买 2 件商品,假设其中较便宜的价格是 P (如果两件商品价格一样, 则…...
PgSQL的with as语法
returning 返回的这一些字段,然后进行汇总为remove_alarms 然后select一下remove_alarms 出来的数据然后保存到tb_alarm_his 里面 with remove_alarms as( delete fromtb_alarm whereid in (508) returning 0,now(),admin,alarmadvice,alarmadvicecn,alarmarises…...
六、c++代码中的安全风险-fopen
(misc) fopen: Check when opening files - can an attacker redirect it (via symlinks), force the opening of special file type (e.g., device files), move things around to create a race condition, control its ancestors, or change its contents? (CWE-362). 为…...
uniapp项目问题及解决(前后端互联)
1.路由跳转的问题 uni.navigateTo() 保留当前页面,跳转到应用内的某个页面,使用uni.navigateBack可以返回到原页面 uni.redirectTo() 关闭当前页面,跳转到应用内的某个页面。 uni.reLaunch&…...
面试算法-154-搜索二维矩阵 II
题目 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性: 每行的元素从左到右升序排列。 每列的元素从上到下升序排列。 示例 1: 输入:matrix [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,…...
Java中Stream流介绍
Java 8引入的Stream API是Java中处理集合的一种高效方式,它提供了一种高级的迭代方式,允许你以声明式方式处理数据。Stream API可以对数据执行复杂的查询操作,而不需要编写冗长且复杂的循环语句。下面是一些使用Stream API的常见场景和示例&a…...
3步彻底清理Windows右键菜单:ContextMenuManager高效管理指南
3步彻底清理Windows右键菜单:ContextMenuManager高效管理指南 【免费下载链接】ContextMenuManager 🖱️ 纯粹的Windows右键菜单管理程序 项目地址: https://gitcode.com/gh_mirrors/co/ContextMenuManager 你是否曾因Windows右键菜单中堆积如山的…...
零基础转行信息安全,老师傅来支招
现在这个环境下,转行做信息安全的人已经越来越少了,但还是有热爱这一行的人。 今天,我们以零基础入行为例,按照下面的成长路径,来分析分析从2025年的招聘数据来看,需要哪些能力。 对零基础转行的人来说&a…...
书匠策AI官网www.shujiangce.com|别再死磕“洗稿式降重“了!这才是2025论文通关的正确姿势
🫠 你有没有经历过这种"窒息时刻"? 凌晨两点,你对着查重报告,满屏飘红像开了大灯的KTV。你一句一句地改,把"因此"换成"所以",把"研究表明"换成"分析发现&qu…...
从零搭建高效AI协作工作流,NotebookLM团队空间配置、知识对齐与冲突消解全链路实操手册
更多请点击: https://intelliparadigm.com 第一章:NotebookLM团队协作功能概览 NotebookLM 是 Google 推出的基于 LLM 的研究型笔记工具,其团队协作能力围绕“共享上下文、实时协同、权限精细化”三大核心设计。当多个成员加入同一 Notebook…...
基于NUC980开发板的嵌入式国学唐诗学习机全栈开发实践
1. 项目概述:当嵌入式开发板遇上国学经典最近在捣鼓一块NUC980开发板,具体型号是NK-980IoT。这板子性能不错,接口也丰富,但总感觉拿它跑个简单的网络服务或者做个数据采集有点“大材小用”。正好家里小朋友开始背唐诗,…...
XUnity Auto Translator:3分钟为Unity游戏添加多语言支持的终极方案
XUnity Auto Translator:3分钟为Unity游戏添加多语言支持的终极方案 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 你是否曾经因为语言障碍而无法畅玩心爱的Unity游戏?或者作为游…...
终极指南:在Windows上直接安装安卓APK的3大优势与6个实用技巧
终极指南:在Windows上直接安装安卓APK的3大优势与6个实用技巧 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer APK Installer是一款专为Windows系统设计的安…...
AI专著撰写秘籍!4款工具助力一键生成20万字专著,高效又省心!
创新是学术专著最核心的部分,也是写作过程中最大的挑战。一部优秀的专著,不仅要避免简单的研究成果重复堆砌,更需要在整个作品中提出独到的观点、理论架构或研究手法。在众多学术文献中,发现那些尚未被开发的研究空白相当不易——…...
Taotoken多模型聚合平台助力每日大赛选手灵活选型
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 Taotoken多模型聚合平台助力每日大赛选手灵活选型 对于每日参与算法或创意大赛的选手而言,赛题往往多变,需…...
告别手动!用Allegro Testprep脚本批量处理测试点,效率提升200%
Allegro Testprep脚本自动化:高密度PCB测试点优化实战指南 在高速PCB设计领域,测试点布局常常成为制约项目进度的隐形瓶颈。当面对超过500个网络的高密度主板时,传统手动调整测试点的方式会让工程师陷入无尽的重复劳动——据统计,…...

