1. 概述
本教程將演示一些基本實際案例中的緩存配置。我們重點展示如何配置此緩存機制以具有時間限制。我們將這種時間限制稱為緩存的“過期時間”(TTL)。
2. Spring 緩存配置
此前,我們已經演示瞭如何使用 Spring 中的 @Cacheable 註解。 緩存的一個實用場景是,當酒店預訂網站的主頁頻繁打開時。 這意味着提供酒店列表的 REST 端點經常被請求,從而頻繁地向數據庫發出請求。 與從內存中提供數據相比,數據庫調用速度較慢。
首先,我們將創建 SpringCachingConfig:
@Configuration
@EnableCaching
public class SpringCachingConfig {
@Bean
public CacheManager cacheManager() {
return new ConcurrentMapCacheManager("hotels");
}
}我們還需要使用 SpringCacheCustomizer:
@Component
public class SpringCacheCustomizer implements CacheManagerCustomizer<ConcurrentMapCacheManager> {
@Override
public void customize(ConcurrentMapCacheManager cacheManager) {
cacheManager.setCacheNames(asList("hotels"));
}
}3. @緩存 (Cacheable) 緩存
完成設置後,我們可以利用 Spring 配置。通過將 酒店 對象存儲在內存中,可以減少 REST 端點響應時間。我們使用 @Cacheable 註解來緩存 酒店 對象的列表,如代碼片段所示:
@Cacheable("hotels")
public List<Hotel> getAllHotels() {
return hotelRepository.getAllHotels();
}4. 設置 @Cacheable 的 TTL
然而,由於數據庫中的 Hotels 列表可能會隨着更新、刪除或新增操作而發生變化,因此我們希望通過設置時間到生間隔 (TTL) 來刷新緩存,在方法(見上文第 3 節)的首次調用時,現有緩存條目將被刪除並重新填充。
我們可以通過使用 @CacheEvict 註解來實現。例如,在下面的示例中,我們通過設置 caching.spring.hotelListTTL 變量來設置 TTL。
@CacheEvict(value = "hotels", allEntries = true)
@Scheduled(fixedRateString = "${caching.spring.hotelListTTL}")
public void emptyHotelsCache() {
logger.info("emptying Hotels cache");
}我們希望 TTL 設置為 12 小時。以毫秒為單位,其值為 12 x 3600 x 1000 = 43200000。我們將其定義在環境屬性中。此外,如果我們在基於屬性的環境配置中,則可以如下設置緩存 TTL:
caching.spring.hotelListTTL=43200000當然,以下是翻譯後的內容:
或者,如果使用基於 YAML 的設計,我們可以將其設置為:
caching:
spring:
hotelListTTL: 432000005. 結論
在本文中,我們探討了如何為基於 Spring 的緩存設置 TTL 緩存。