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 并没有提供一键清除所有缓存的功能,但我们可以通过 CacheManagergetCacheNames() 方法轻松实现。

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 仓库 中找到。


原始标题:Cache Eviction in Spring Boot