知識庫 / Spring / Spring Boot RSS 訂閱

Spring Boot 緩存失效

Spring Boot
HongKong
5
01:36 PM · Dec 06 ,2025

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 等)兼容。

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.