Spring Boot轻松整合Redis缓存实战
Spring Boot 整合 Redis 缓存
Redis 是一种高性能的键值存储数据库,常用于缓存、消息队列等场景。Spring Boot 提供了对 Redis 的自动配置支持,可以轻松实现缓存功能。以下是如何在 Spring Boot 项目中整合 Redis 缓存的详细步骤。
添加依赖
在 pom.xml 文件中添加 Spring Boot Redis 和缓存相关的依赖:
<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>
如果需要使用 Redis 的 Lettuce 客户端(默认),则无需额外配置;如果需要 Jedis,可以添加以下依赖:
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
配置 Redis 连接
在 application.properties 或 application.yml 中配置 Redis 连接信息:
# Redis 服务器地址
spring.redis.host=localhost
# Redis 服务器端口
spring.redis.port=6379
# Redis 密码(如果没有密码可以省略)
spring.redis.password=
# 连接池配置(可选)
spring.redis.lettuce.pool.max-active=8
spring.redis.lettuce.pool.max-idle=8
spring.redis.lettuce.pool.min-idle=0
启用缓存支持
在 Spring Boot 主类或配置类上添加 @EnableCaching 注解以启用缓存功能:
@SpringBootApplication
@EnableCaching
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
配置 Redis 缓存管理器
可以通过自定义 RedisCacheManager 来配置缓存的过期时间、序列化方式等:
@Configuration
public class RedisConfig {
@Bean
public RedisCacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
RedisCacheConfiguration cacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofMinutes(10)) // 设置缓存过期时间为 10 分钟
.disableCachingNullValues(); // 禁止缓存 null 值
return RedisCacheManager.builder(redisConnectionFactory)
.cacheDefaults(cacheConfiguration)
.build();
}
}
使用缓存注解
Spring 提供了以下常用缓存注解:
@Cacheable:标记方法的返回值需要被缓存。@CachePut:更新缓存,通常用于更新操作。@CacheEvict:清除缓存,通常用于删除操作。
示例:缓存查询结果
@Service
public class UserService {
@Cacheable(value = "users", key = "#id")
public User getUserById(Long id) {
// 模拟数据库查询
return userRepository.findById(id).orElse(null);
}
}
示例:更新缓存
@CachePut(value = "users", key = "#user.id")
public User updateUser(User user) {
return userRepository.save(user);
}
示例:清除缓存
@CacheEvict(value = "users", key = "#id")
public void deleteUser(Long id) {
userRepository.deleteById(id);
}
自定义缓存 Key
可以通过 SpEL 表达式自定义缓存的 Key:
@Cacheable(value = "users", key = "'user:' + #id")
public User getUserById(Long id) {
// ...
}
缓存的 Key 将形如 user:1。
缓存条件与条件排除
可以通过 condition 和 unless 属性控制缓存的条件:
@Cacheable(value = "users", key = "#id", unless = "#result == null")
public User getUserById(Long id) {
// 仅当返回值不为 null 时缓存
return userRepository.findById(id).orElse(null);
}
缓存同步模式
在多线程环境下,可以使用 sync 属性启用同步模式,避免缓存击穿:
@Cacheable(value = "users", key = "#id", sync = true)
public User getUserById(Long id) {
// 同一时间只有一个线程可以执行方法,其他线程等待缓存结果
return userRepository.findById(id).orElse(null);
}
测试缓存功能
编写测试类验证缓存是否生效:
@SpringBootTest
public class CacheTest {
@Autowired
private UserService userService;
@Test
public void testCache() {
// 第一次调用,会执行方法并缓存结果
User user1 = userService.getUserById(1L);
// 第二次调用,直接从缓存获取,不会执行方法
User user2 = userService.getUserById(1L);
// 验证两次返回的对象是否为同一个实例
Assert.assertSame(user1, user2);
}
}
缓存监控与管理
可以通过 Redis 命令行工具或可视化工具(如 RedisInsight)查看缓存数据:
redis-cli
> KEYS *
> GET "users::1"
常见问题与解决方案
- 缓存穿透:查询不存在的数据导致大量请求直接打到数据库。可以通过缓存空值或使用布隆过滤器解决。
- 缓存雪崩:大量缓存同时失效导致数据库压力激增。可以设置不同的过期时间或使用缓存预热。
- 缓存击穿:热点 Key 失效导致大量请求直接打到数据库。可以使用互斥锁或永不过期策略。
通过以上步骤,可以在 Spring Boot 项目中高效整合 Redis 缓存,显著提升系统性能。
BbS.okacop092.info/PoSt/1120_139626.HtM
BbS.okacop093.info/PoSt/1120_395966.HtM
BbS.okacop094.info/PoSt/1120_891075.HtM
BbS.okacop095.info/PoSt/1120_497730.HtM
BbS.okacop096.info/PoSt/1120_992473.HtM
BbS.okacop097.info/PoSt/1120_078002.HtM
BbS.okacop098.info/PoSt/1120_481937.HtM
BbS.okacop099.info/PoSt/1120_483903.HtM
BbS.okacop114.info/PoSt/1120_315534.HtM
BbS.okacop829.info/PoSt/1120_518148.HtM
BbS.okacop092.info/PoSt/1120_050133.HtM
BbS.okacop093.info/PoSt/1120_842260.HtM
BbS.okacop094.info/PoSt/1120_951465.HtM
BbS.okacop095.info/PoSt/1120_460172.HtM
BbS.okacop096.info/PoSt/1120_230043.HtM
BbS.okacop097.info/PoSt/1120_728214.HtM
BbS.okacop098.info/PoSt/1120_618918.HtM
BbS.okacop099.info/PoSt/1120_743134.HtM
BbS.okacop114.info/PoSt/1120_065144.HtM
BbS.okacop829.info/PoSt/1120_430556.HtM
BbS.okacop092.info/PoSt/1120_266033.HtM
BbS.okacop093.info/PoSt/1120_623555.HtM
BbS.okacop094.info/PoSt/1120_616704.HtM
BbS.okacop095.info/PoSt/1120_601734.HtM
BbS.okacop096.info/PoSt/1120_779408.HtM
BbS.okacop097.info/PoSt/1120_463786.HtM
BbS.okacop098.info/PoSt/1120_513106.HtM
BbS.okacop099.info/PoSt/1120_537795.HtM
BbS.okacop114.info/PoSt/1120_625855.HtM
BbS.okacop829.info/PoSt/1120_584370.HtM
BbS.okacop092.info/PoSt/1120_256009.HtM
BbS.okacop093.info/PoSt/1120_027724.HtM
BbS.okacop094.info/PoSt/1120_338981.HtM
BbS.okacop095.info/PoSt/1120_595896.HtM
BbS.okacop096.info/PoSt/1120_768807.HtM
BbS.okacop097.info/PoSt/1120_053805.HtM
BbS.okacop098.info/PoSt/1120_298470.HtM
BbS.okacop099.info/PoSt/1120_074213.HtM
BbS.okacop114.info/PoSt/1120_605714.HtM
BbS.okacop829.info/PoSt/1120_985518.HtM
BbS.okacop092.info/PoSt/1120_168896.HtM
BbS.okacop093.info/PoSt/1120_415247.HtM
BbS.okacop094.info/PoSt/1120_772764.HtM
BbS.okacop095.info/PoSt/1120_733710.HtM
BbS.okacop096.info/PoSt/1120_199721.HtM
BbS.okacop097.info/PoSt/1120_613761.HtM
BbS.okacop098.info/PoSt/1120_018519.HtM
BbS.okacop099.info/PoSt/1120_290785.HtM
BbS.okacop114.info/PoSt/1120_847717.HtM
BbS.okacop829.info/PoSt/1120_030673.HtM
BbS.okacop092.info/PoSt/1120_992303.HtM
BbS.okacop093.info/PoSt/1120_591693.HtM
BbS.okacop094.info/PoSt/1120_645958.HtM
BbS.okacop095.info/PoSt/1120_171101.HtM
BbS.okacop096.info/PoSt/1120_341860.HtM
BbS.okacop097.info/PoSt/1120_391278.HtM
BbS.okacop098.info/PoSt/1120_094642.HtM
BbS.okacop099.info/PoSt/1120_687652.HtM
BbS.okacop114.info/PoSt/1120_854338.HtM
BbS.okacop829.info/PoSt/1120_275763.HtM
BbS.okacop092.info/PoSt/1120_349846.HtM
BbS.okacop093.info/PoSt/1120_248139.HtM
BbS.okacop094.info/PoSt/1120_566288.HtM
BbS.okacop095.info/PoSt/1120_049375.HtM
BbS.okacop096.info/PoSt/1120_269269.HtM
BbS.okacop097.info/PoSt/1120_269416.HtM
BbS.okacop098.info/PoSt/1120_740316.HtM
BbS.okacop099.info/PoSt/1120_285100.HtM
BbS.okacop114.info/PoSt/1120_579303.HtM
BbS.okacop829.info/PoSt/1120_199240.HtM
BbS.okacop092.info/PoSt/1120_876595.HtM
BbS.okacop093.info/PoSt/1120_917293.HtM
BbS.okacop094.info/PoSt/1120_973423.HtM
BbS.okacop095.info/PoSt/1120_024444.HtM
BbS.okacop096.info/PoSt/1120_927617.HtM
BbS.okacop097.info/PoSt/1120_847363.HtM
BbS.okacop098.info/PoSt/1120_521467.HtM
BbS.okacop099.info/PoSt/1120_294505.HtM
BbS.okacop114.info/PoSt/1120_438752.HtM
BbS.okacop829.info/PoSt/1120_043937.HtM
查看9道真题和解析
哔哩哔哩公司福利 876人发布