如何在SpringBoot中清除所有快取 ?

banq發表於2021-06-10

快取提高了效能,但也引入了一致性問題。這就是為什麼在我的 Spring Boot 應用程式中啟用快取後,我意識到提供一個程式來按需清除所有快取是多麼重要。
登入到您的伺服器以手動釋放 您的應用程式的所有快取資料應該是最後一個絕望的選擇。因此,我開始尋找方法來為管理員提供一種在需要時清除所有快取的可靠且安全的方法。幸運的是,這可以透過幾行程式碼輕鬆實現。
讓我們看看如何定義一個自定義 API,旨在清除 Spring Boot 應用程式的快取。
 
構建 API
假設您的應用程式已經使用了快取引擎,並使用了Spring Cache 模組。一切都被認為是正確配置的。
為了處理快取,Spring在啟動時內部建立了一個CacheManager bean。儘管 Spring 不提供按需清除所有快取的功能,但您可以透過利用此快取管理器來實現這一點。
事實上,它的getCacheNames()方法返回您的管理器中已知的快取名稱的集合。透過迭代它們,您可以檢索當前正在處理的每個Cache例項,並clear()在每個例項上呼叫該方法。
透過這種簡單的方法,您可以定義一種安全的方法來清除 Spring Boot 應用程式中使用的所有快取。這就是為什麼設計一個 API 來實現這樣的目標並不複雜,可以實現如下:

@RestController
@RequestMapping("/caches")
public class CachingController {
    @Autowired
    private CacheManager cacheManager;

    @DeleteMapping("clear")
    public ResponseEntity<Void> clearAllCaches() {
        cacheManager
                .getCacheNames()
                .stream()
                .forEach(cacheName -> cacheManager.getCache(cacheName).clear());
    }
}

您只需要自動連線已實現的CacheManager bean 並遵循上述方法。透過將這個邏輯封裝在一個公開的端點中,您實際上是在定義一個觸發器,只要呼叫 API 就可以啟用它。
請注意,只有在插入第一個條目時才會初始化快取。這意味著在CacheManager快取任何資料之前,您不會看到任何可用的快取。

 

相關文章