当前位置: 首页 > 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://www.xdnf.cn/news/1465669.html

相关文章:

  • [bat-cli] 输出处理 | `OutputType` 和 `OutputHandle`
  • 基于华为云平台的STM32F103C8T6工业生产线温湿度监控系统
  • 深度学习书籍推荐
  • LangChain: Models, Prompts 模型和提示词
  • UE4 Mac构建编译报错 no member named “disjunction” in namespace “std”
  • 企业为何仍困在“数据孤岛”?——从iPaaS重构信息流的实践路径
  • 一个专为地图制图和数据可视化设计的在线配色网站,可以助你制作漂亮的地图!
  • Leetcode—2749. 得到整数零需要执行的最少操作数【中等】(__builtin_popcountl)
  • 嵌入式系统学习Day31(多路IO复用)
  • Android Studio新版本编译release版本apk实现
  • 在Ubuntu 20.04的服务器上查找的服务器的IP地址
  • 2025最全的软件测试面试八股文(含答案+文档)
  • 属性关键字
  • Kubernetes(k8s) po 配置持久化挂载(nfs)
  • Ansible 角色使用指南
  • js设计模式-状态模式
  • 腾讯最新开源HunyuanVideo-Foley本地部署教程:端到端TV2A框架,REPA策略+MMDiT架构,重新定义视频音效新SOTA!
  • 2025精选5款AI视频转文字工具,高效转录秒变文字!
  • MySQL集群——主从复制
  • MongoDB 源码编译与调试:深入理解存储引擎设计
  • solidity的高阶语法
  • 【Linux】网络安全管理:SELinux 和 防火墙联合使用 | Redhat
  • 红黑树 + 双链表最小调度器原型
  • 【JMeter】分布式集群压测
  • 解锁上下文的力量:大型语言模型中的上下文工程全解析
  • Java基础篇02:基本语法
  • CAD:修改
  • 23.【C++进阶】异常(try、catch、throw)
  • SQL表一共有几种写入方式
  • 零基础入门AI: YOLOv5 详解与项目实战