Spring Boot 集成 Redis 缓存实战
2026年6月 · 约12分钟 · 标签:Spring Boot · Redis · 缓存
Spring Data Redis 配合 Spring Cache Abstraction,可以非常方便地在 Spring Boot 项目中引入缓存层。本文记录在实际项目中配置和使用 Redis 缓存的经验。
一、依赖引入与基础配置
在 pom.xml 中添加依赖:
<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>
配置文件 application.yml 中指定 Redis 连接信息:
spring:
redis:
host: localhost
port: 6379
timeout: 2000ms
lettuce:
pool:
max-active: 8
max-idle: 8
min-idle: 2
cache:
type: redis
连接池使用 Lettuce(Spring Boot 2.x 后的默认客户端),性能优于 Jedis,且支持异步和响应式编程。
二、缓存配置类
创建 Redis 缓存配置类,设置 Key 和 Value 的序列化方式以及默认过期时间:
@Configuration
@EnableCaching
public class RedisCacheConfig {
@Bean
public RedisCacheManager cacheManager(RedisConnectionFactory factory) {
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofMinutes(30))
.serializeKeysWith(
RedisSerializationContext.SerializationPair.fromSerializer(
new StringRedisSerializer()))
.serializeValuesWith(
RedisSerializationContext.SerializationPair.fromSerializer(
new Jackson2JsonRedisSerializer<>(Object.class)))
.disableCachingNullValues();
return RedisCacheManager.builder(factory)
.cacheDefaults(config)
.build();
}
}
三、使用缓存注解
Spring Cache 提供了四个核心注解。以用户信息查询为例:
@Cacheable
查询时先检查缓存,有则直接返回,没有则执行方法并将结果缓存:
@Cacheable(value = "users", key = "#id")
public User getUserById(Long id) {
return userMapper.selectById(id);
}
@CachePut
更新数据后同时更新缓存:
@CachePut(value = "users", key = "#user.id")
public User updateUser(User user) {
userMapper.updateById(user);
return user;
}
@CacheEvict
删除数据后清除缓存:
@CacheEvict(value = "users", key = "#id")
public void deleteUser(Long id) {
userMapper.deleteById(id);
}
四、缓存策略选择
实际项目中不同场景需要不同的缓存策略:
- 热点数据:访问频率高且实时性要求不高的数据(如配置信息、分类列表),建议缓存时间 30 分钟到 2 小时。
- 会话数据:用户登录状态等需要共享的数据,使用 Redis 的 expire 机制控制过期时间。
- 计数器:使用 Redis 的 INCR/DECR 命令实现原子计数,适合点赞数、访问量等场景。
五、缓存穿透/击穿/雪崩应对
缓存穿透
查询一个不存在的数据,由于缓存中没有,每次都会查数据库。解决方案:
- 缓存空值:即使是 null 结果也缓存,设置较短的过期时间(如 5 分钟)。
- 布隆过滤器:在缓存层之前加一层布隆过滤器,快速判断 key 是否可能存在。
缓存击穿
某个热点 key 在过期瞬间有大量并发请求同时到达。解决方案:
- 互斥锁:只允许一个线程去查数据库重建缓存,其他线程等待。
- 热点数据不过期:后台定时刷新。
缓存雪崩
大量 key 在同一时间过期,导致请求全部落到数据库。解决方案:
- 过期时间加随机值:在基础过期时间上增加随机偏移,避免集体过期。
- 多级缓存:本地缓存(Caffeine)+ 分布式缓存(Redis)组合。
六、监控与调优
使用 Redis 自带的 INFO 命令可以查看缓存命中率等指标。结合 Spring Boot Actuator 的 /actuator/metrics 可以查看缓存操作的统计信息,便于识别热点和优化缓存策略。生产环境中建议开启 Redis 的慢查询日志,定位耗时较高的命令。
七、总结
合理使用 Redis 缓存可以显著提升系统性能,但缓存策略需要根据业务场景精心设计。一味地加缓存而不考虑一致性、过期策略等问题,可能会引入数据不一致、缓存雪崩等更棘手的问题。建议先梳理业务场景,明确哪些数据适合缓存、缓存多久、如何更新,再动手实施。