1. 概述
本快速教程將教您如何使用 Spring 執行緩存清除。為了演示這一過程,我們將創建一個小型示例。
在繼續之前,請查看我們的文章《Spring 緩存指南》,以便熟悉 Spring 緩存的工作原理。
2. 如何清除緩存?
Spring 提供了兩種清除緩存的方式,即通過在方法上使用 @CacheEvict 註解,或通過自動注入 CacheManager 並通過調用 clear() 方法來清除它。以下是如何在代碼中實現這兩種緩存清除機制。
2.1. 使用 @CacheEvict
讓我們創建一個空的方法,並添加 @CacheEvict 註解,同時將我們想要清除的緩存名稱作為註解參數提供。在本例中,我們想要清除名稱為“first”的緩存:
@CacheEvict(value = "first", allEntries = true)
public void evictAllCacheValues() {}Spring 將攔截所有帶有 > 註解的方法,並根據 標誌清除所有值。
還可以根據特定鍵清除值。為此,只需將緩存鍵作為參數傳遞到註解中,代替 標誌:
@CacheEvict(value = "first", key = "#cacheKey")
public void evictSingleCacheValue(String cacheKey) {}由於 key 屬性的值是動態的,我們可以使用 Spring 表達式語言,或者通過實現 KeyGenerator 接口來生成自定義鍵,從而選擇感興趣的參數或嵌套屬性。
2.2. 使用 CacheManager
接下來,讓我們看看如何使用 Spring Cache 模塊提供的 CacheManager 來清除緩存。首先,我們需要自動注入實現該 CacheManager 的 Bean。
然後,我們可以根據需要使用它清除緩存:
@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() 方法則會根據鍵清除值
3. 如何清除所有緩存?
Spring 不提供內置的清除所有緩存功能,但我們可以通過使用緩存管理器中的 getCacheNames() 方法輕鬆實現。3.1. 隨時清除緩存
現在讓我們看看如何隨時清除所有緩存。為了創建一個觸發點,我們首先需要暴露一個端點:
@RestController
public class CachingController {
@Autowired
CachingService cachingService;
@GetMapping("clearAllCaches")
public void clearAllCaches() {
cachingService.evictAllCaches();
}
}在 CachingService 中,我們可以通過迭代從緩存管理器獲取的緩存名稱來清除所有緩存:
public void evictAllCaches() {
cacheManager.getCacheNames().stream()
.forEach(cacheName -> cacheManager.getCache(cacheName).clear());
}3.2. 自動驅逐
在某些用例中,緩存驅逐應在特定間隔內自動執行。在這種情況下,我們可以利用 Spring 的任務調度器:
@Scheduled(fixedRate = 6000)
public void evictAllcachesAtIntervals() {
evictAllCaches();
}4. 結論
在本文中,我們學習瞭如何通過多種方式清除緩存。值得注意的是,這些機制將與各種緩存實現(如 eh-cache、infini-span、apache-ignite 等)兼容。