当前位置: 首页 > news >正文

springboot redis 缓存入门与实战

Spring Boot3 Redis 项目地址

https://gitee.com/supervol/loong-springboot-study

(记得给个start,感谢)

Redis 介绍

        Redis 是一款高性能的 内存数据库(支持持久化),兼具缓存、NoSQL 存储、分布式锁等核心能力;Spring Boot 3 作为主流的 Java 开发框架,通过 spring-boot-starter-data-redis starter 简化了 Redis 的整合流程,降低了开发门槛。

Redis 核心

        开源内存数据库,支持 String、Hash、List、Set、ZSet 等数据结构,主打高性能(QPS 达 10W+)、低延迟,常用于缓存、分布式锁、会话存储等场景。Spring Boot 3 为 Redis 提供了两个核心操作类:RedisTemplate 和 StringRedisTemplate,两者定位不同,需根据场景选择。

1. StringRedisTemplate

  • 定位:专门处理 String 类型 的 Redis 操作(键和值均为 String)。
  • 默认配置:使用 StringRedisSerializer 序列化键和值,序列化后的数据在 Redis 中 可读性强(无乱码)。
  • 适用场景:存储简单字符串(如验证码、会话 ID、计数器等)。

2. RedisTemplate

  • 定位:通用 Redis 操作类,支持 任意类型 的键和值(通过泛型 RedisTemplate<K, V> 约束)。
  • 默认配置问题:默认使用 JdkSerializationRedisSerializer 序列化,会导致 Redis 中存储的是 二进制数据(可读性差,且需实体类实现 Serializable 接口),不推荐直接使用默认配置
  • 优化方案:自定义 RedisTemplate,使用 Jackson2JsonRedisSerializer 序列化(支持 JSON 格式,可读性强,无需实现 Serializable)。

Redis 示例

1. 前置条件

  • JDK 17+(推荐 JDK 17 或 21)
  • 构建工具:Maven 3.6+
  • 开发工具:IntelliJ IDEA
  • Redis 环境: Redis 6.x+       

2. 代码位置

        请参考项目地址中 springboot-cache/springboot-redis 模块代码。

Redis 高级

        Spring Boot 3 不仅支持 Redis 基础操作,还能便捷整合其高级特性(如缓存抽象、分布式锁、发布订阅)。基于 Redis 的缓存抽象,Spring 提供了 缓存注解(如 @Cacheable),结合 Redis 可快速实现缓存功能,无需手动调用 RedisTemplate

步骤 1:启用缓存

        在启动类上添加 @EnableCaching 注解:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;@SpringBootApplication
@EnableCaching // 启用 Spring 缓存抽象
public class RedisDemoApplication {public static void main(String[] args) {SpringApplication.run(RedisDemoApplication.class, args);}
}

步骤 2:使用缓存注解

        常用注解说明及示例:

注解作用
@Cacheable方法执行前先查缓存,有则返回缓存值;无则执行方法,将结果存入缓存。
@CachePut执行方法后,将结果存入缓存(覆盖旧值,常用于更新操作)。
@CacheEvict删除缓存(常用于删除操作,支持批量删除)。
@Caching组合多个缓存操作(如同时 @Cacheable 和 @CacheEvict)。

示例代码:

import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;@Service
public class UserService {/*** 查询用户:优先查缓存(key 为 "user:userId"),无则查数据库并缓存(1 小时过期)*/@Cacheable(value = "user", // 缓存名称(对应 Redis 中的 key 前缀:user::xxx)key = "#userId", // 缓存 key 的后缀(SpEL 表达式,#userId 为方法参数)unless = "#result == null", // 结果为 null 时不缓存timeout = 3600 // 缓存过期时间(秒))public User getUserById(Long userId) {// 模拟数据库查询(实际项目中替换为 MyBatis/JPA 调用)System.out.println("查询数据库:userId = " + userId);return new User(userId, "张三", 25, "zhangsan@xxx.com");}/*** 更新用户:执行方法后更新缓存(覆盖旧值)*/@CachePut(value = "user",key = "#user.id", // 用用户 ID 作为 keyunless = "#user == null")public User updateUser(User user) {// 模拟数据库更新System.out.println("更新数据库:user = " + user);return user;}/*** 删除用户:执行方法后删除缓存*/@CacheEvict(value = "user",key = "#userId")public void deleteUser(Long userId) {// 模拟数据库删除System.out.println("删除数据库:userId = " + userId);}
}

Redis 指南

1. 序列化方式选择

序列化器优点缺点推荐度
Jackson2JsonRedisSerializer可读性强、支持复杂对象、无需实现 Serializable需配置类型信息(避免反序列化丢失类型)★★★★★
StringRedisSerializer可读性强、轻量仅支持 String 类型★★★★☆
JdkSerializationRedisSerializer无需额外配置、支持所有实现 Serializable 的类可读性差(二进制)、需实现 Serializable★★☆☆☆

        结论:优先使用 Jackson2JsonRedisSerializer(自定义 RedisTemplate)。

2. 连接池配置优化

  • max-active:根据并发量调整(如 16-64,避免过大导致 Redis 压力)。
  • max-idle:建议与 max-active 一致(避免频繁创建连接)。
  • max-wait:设置为 1-3 秒(避免无限等待,快速失败)。
  • timeout:设置为 1-3 秒(避免网络波动导致的长时间阻塞)。

3. 缓存问题解决方案

问题原因解决方案
缓存穿透请求不存在的 key,穿透缓存直击数据库1. 缓存空值(短期过期);2. 使用布隆过滤器
缓存击穿热点 key 过期,大量请求直击数据库1. 互斥锁(如 Redisson 锁);2. 热点 key 永不过期
缓存雪崩大量 key 同时过期,数据库压力骤增1. 过期时间加随机值(分散过期);2. 集群部署 Redis

4. 数据一致性保障

        缓存与数据库同步的核心原则:先更新数据库,后操作缓存(避免脏数据)。

  • 更新操作:更新数据库 → 删除缓存(推荐,避免更新缓存失败导致脏数据)。
  • 删除操作:删除数据库 → 删除缓存。

总结        

        Spring Boot 3 整合 Redis 简化了开发流程,通过 RedisTemplate/StringRedisTemplate 可快速操作 Redis 基础数据结构,结合 Spring 缓存抽象、Redisson 分布式锁等高级特性,能满足企业级应用的核心需求。实际开发中需注意序列化配置、连接池优化、缓存一致性等问题,确保系统高性能、高可用。Redis 的场景覆盖 缓存、分布式协调、计数、消息、排序 等多个领域,核心是利用其 高性能、多结构、原子性 的特性解决传统数据库或单体应用的痛点。实际使用时需根据业务需求选择合适的数据结构和命令,同时注意内存管理、持久化策略和高可用部署(如主从、集群)。


文章转载自:

http://rpsUqehj.mwLxk.cn
http://l3j1WKfM.mwLxk.cn
http://otO2xAyB.mwLxk.cn
http://AIPQMpCg.mwLxk.cn
http://iJJrEv4l.mwLxk.cn
http://3Is7NtA8.mwLxk.cn
http://KGcoBKBP.mwLxk.cn
http://IsBHGgBy.mwLxk.cn
http://xpisBtrt.mwLxk.cn
http://ADH12nko.mwLxk.cn
http://l90ov8nY.mwLxk.cn
http://gnW9fKTJ.mwLxk.cn
http://QI7jfAlB.mwLxk.cn
http://YtTgSNEb.mwLxk.cn
http://rkWodpQg.mwLxk.cn
http://CB8dhDID.mwLxk.cn
http://hr2ClMIt.mwLxk.cn
http://JdzSQrlo.mwLxk.cn
http://nWOlzef0.mwLxk.cn
http://X6p63Y40.mwLxk.cn
http://rKUSChHo.mwLxk.cn
http://4xjzvIaP.mwLxk.cn
http://S9DZ0Gt0.mwLxk.cn
http://JTXylGPi.mwLxk.cn
http://vrsrwqay.mwLxk.cn
http://ONck0YGL.mwLxk.cn
http://QOIQKbed.mwLxk.cn
http://yQZzEK4W.mwLxk.cn
http://5tf5X9Yx.mwLxk.cn
http://Ha79p8NF.mwLxk.cn
http://www.dtcms.com/a/368644.html

相关文章:

  • 在 vue-vben-admin(v5 版本)中,使用 ECharts 图表(豆包版)
  • 数码视讯TR100-OTT-G1_国科GK6323_安卓9_广东联通原机修改-TTL烧录包-可救砖
  • RWA 技术:让实体消费积分变身可信数字资产
  • 蚂蚁 S21 XP+ HYD 500T矿机评测:SHA-256算法与高效冷却技术的结合
  • DAY1:错题日记
  • 直播美颜SDK的技术架构剖析:人脸美型功能的实现原理与优化策略
  • Kafka 消息队列:揭秘海量数据流动的技术心脏
  • 2025 年高教社杯全国大学生数学建模竞赛C 题 NIPT 的时点选择与胎儿的异常判定详解(一)
  • 当低代码遇上AI,有趣,实在有趣
  • 从“找新家”到“走向全球”,布尔云携手涂鸦智能开启机器人新冒险
  • 低代码核心原理总结
  • rust语言 (1.88) egui (0.32.1) 学习笔记(逐行注释)(二十五)窗口图标 / 任务栏图标
  • 安科瑞基站智慧运维云平台:安全管控与节能降耗双效赋能
  • BYOFF(自定义格式函数)(79)
  • 在 CentOS 9 上安装 Docker 的完整指南
  • 机器学习算法介绍二
  • 【MYSQL | 高级篇 日志、主从复制与读写分离】
  • IO进程线程;多线程;线程互斥同步;互斥锁;无名信号量;条件变量;0905
  • 虚拟机详细图文教程系列15、Linux虚拟机Centos8系统部署禅道开源项目
  • uniapp开发小程序,列表 点击后加载更多数据
  • 云市场周报 (2025.09.05):解读腾讯云AI安全、阿里数据湖与KubeVela
  • 一键生成PPT的AI工具排名:2025年能读懂你思路的AI演示工具
  • 【数据结构、java学习】数组(Array)
  • 越南电网3D地图
  • 大数据毕业设计选题推荐-基于大数据的分化型甲状腺癌复发数据可视化分析系统-Spark-Hadoop-Bigdata
  • Kubernetes 全景指南:从核心概念到云原生未来
  • 视频监控展示插件-js,支持多种视频格式
  • 2025年国家高新技术企业认定:申报材料和流程详解
  • 【面试场景题】spring应用启动时出现内存溢出怎么排查
  • 【NVIDIA AIQ】自定义函数实践