在高性能应用开发中,缓存是必不可少的一环。它通过将数据存储在高速存储介质(如内存)中,显著减少对底层数据源(如数据库)的访问次数,从而提升系统响应速度和吞吐量。在众多缓存技术中,Redis 以其高性能、丰富的数据结构、分布式特性,成为了 Spring Boot 应用中整合缓存的首选。
Spring Boot 对缓存提供了强大的抽象和自动化配置,使得整合 Redis 缓存变得非常简单。然而,如果仅仅停留在“会用”的层面,而不深入理解其缓存策略和可能遇到的误区,可能会导致缓存失效、数据不一致、性能瓶颈等问题。
本文将详细解析 Spring Boot 整合 Redis 缓存的策略,包括配置、注解使用、以及如何自定义,同时揭示常见的误区和最佳实践,帮助你构建更高效、更稳定的 Spring Boot 缓存应用。
1. 为什么选择 Redis 作为缓存?
- 高性能: Redis 是内存数据库,读写速度极快,可达到每秒数万到数十万次操作。
- 丰富的数据结构: 支持 String、Hash、List、Set、Sorted Set 等多种数据结构,能够满足各种缓存场景。
- 持久化: 支持 RDB 和 AOF 两种持久化方式,保证数据不丢失。
- 分布式: 支持主从复制、哨兵模式和集群模式,实现高可用和水平扩展。
- 原子操作: Redis 的许多操作都是原子性的,避免了并发问题。
- 发布/订阅: 支持发布/订阅模式,可用于构建消息队列或事件通知。
2. Spring Boot 整合 Redis 缓存基础
2.1 引入依赖
首先,在 pom.xml 中引入 Spring Boot Redis Starter 依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId> </dependency>

2.2 配置 Redis 连接
在 application.properties 或 application.yml 中配置 Redis 连接信息:
# application.properties
spring.redis.host=localhost
spring.redis.port=6379
spring.redis.password= # 如果有密码
spring.redis.database=0 # 默认数据库索引
spring.redis.timeout=5000ms # 连接超时时间
# spring.redis.lettuce.pool.max-active=8 # Lettuce 连接池最大连接数
# spring.redis.lettuce.pool.max-idle=8 # Lettuce 连接池最大空闲连接数
# spring.redis.lettuce.pool.min-idle=0 # Lettuce 连接池最小空闲连接数
# spring.redis.lettuce.pool.max-wait=-1ms # Lettuce 连接池最大等待时间
2.3 开启缓存功能
在 Spring Boot 启动类或配置类上添加 @EnableCaching 注解,以开启 Spring Cache 抽象层的功能。
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
@SpringBootApplication
@EnableCaching // 开启缓存功能
public class RedisCacheApplication {
public static void main(String[] args) {
SpringApplication.run(RedisCacheApplication.class, args);
}
}
2.4 使用缓存注解
Spring Cache 提供了多个注解来实现声明式缓存,底层会根据配置的缓存管理器(这里是 Redis)进行操作。
-
@Cacheable: 在方法执行前,Spring 会先检查缓存中是否存在指定 key 的数据。如果存在,则直接返回缓存中的数据,不再执行方法;如果不存在,则执行方法,并将方法返回值存入缓存。value(或cacheNames): 缓存的名称,对应 Redis 中的一个命名空间。key: 缓存的 key,支持 SpEL 表达式。condition: 满足某个条件才缓存。unless: 满足某个条件不缓存(常用于返回值为空或异常时)。sync: 如果为 true,则在多线程并发获取同一 key 时,只有一个线程会执行方法,其他线程会阻塞等待。
-
@CachePut: 无论方法是否执行,都会将方法返回值存入缓存。通常用于更新操作。- 参数与
@Cacheable类似。
- 参数与
-
@CacheEvict: 清除缓存。value(或


被折叠的 条评论
为什么被折叠?



