1. 概述
在这篇简短的教程中,我们将学习 如何在 Spring 中执行缓存清除(Cache Eviction)。为了演示这一点,我们会通过一个小例子来说明。
在继续之前,建议你先阅读我们的文章 《Spring 缓存指南》,以熟悉 Spring 缓存的工作原理。
2. 如何清除缓存?
Spring 提供了两种方式来清除缓存:
✅ 使用 @CacheEvict
注解
✅ 通过自动注入 CacheManager
并调用其 clear()
方法
下面我们分别来看这两种缓存清除机制是如何实现的。
2.1. 使用 @CacheEvict
我们可以通过定义一个空方法,并加上 @CacheEvict
注解来清除缓存。只需要将要清除的缓存名称作为注解参数传入即可。例如,我们要清除名为 "first"
的缓存:
@CacheEvict(value = "first", allEntries = true)
public void evictAllCacheValues() {}
Spring 会在运行时拦截所有带有 @CacheEvict
注解的方法,并根据 allEntries
标志决定是否清除整个缓存区域的内容。
当然,也可以基于特定的 key 来清除缓存项。此时只需将 key 作为注解参数传入,而不需要设置 allEntries
:
@CacheEvict(value = "first", key = "#cacheKey")
public void evictSingleCacheValue(String cacheKey) {}
由于 key
属性支持动态表达式,我们可以使用 Spring Expression Language (SpEL) 或者自定义 KeyGenerator
来提取感兴趣的参数或嵌套属性。
2.2. 使用 CacheManager
另一种清除缓存的方式是通过 Spring 提供的 CacheManager
组件。首先我们需要将其自动注入到我们的类中:
@Autowired
CacheManager cacheManager;
public void evictSingleCacheValue(String cacheName, String cacheKey) {
cacheManager.getCache(cacheName).evict(cacheKey);
}
public void evictAllCacheValues(String cacheName) {
cacheManager.getCache(cacheName).clear();
}
从代码可以看出:
✅ clear()
方法会清空整个缓存区域的所有条目
❌ evict()
方法只会删除指定 key 对应的缓存项
3. 清除所有缓存
Spring 并没有提供一键清除所有缓存的功能,但我们可以通过 CacheManager
的 getCacheNames()
方法轻松实现。
3.1. 手动触发清除
我们可以通过暴露一个接口来手动触发清除所有缓存的操作:
@RestController
public class CachingController {
@Autowired
CachingService cachingService;
@GetMapping("clearAllCaches")
public void clearAllCaches() {
cachingService.evictAllCaches();
}
}
然后在服务层遍历所有的缓存名并逐一清除:
public void evictAllCaches() {
cacheManager.getCacheNames().stream()
.forEach(cacheName -> cacheManager.getCache(cacheName).clear());
}
这种方式简单粗暴,适合用于调试或运维场景。
3.2. 定时自动清除
某些业务场景下,我们可能希望定时自动清除缓存。这时可以借助 Spring 的任务调度功能:
@Scheduled(fixedRate = 6000)
public void evictAllcachesAtIntervals() {
evictAllCaches();
}
⚠️ 注意:记得在主类上添加 @EnableScheduling
注解启用定时任务支持。
4. 小结
本文介绍了在 Spring Boot 中清除缓存的几种常用方式。这些机制对各种主流缓存实现(如 ehcache、infinispan、apache-ignite 等)都适用。
一如既往,文中提到的所有代码示例都可以在 GitHub 仓库 中找到。