1. 概述
本文將介紹如何使用 Spring 的緩存抽象層,獲取 Caffeine Cache 中的所有緩存鍵。
2. Spring 緩存
緩存是 Spring Framework 的一個重要組成部分。自 3.1 版本以來,它就已成為 Spring 生態系統的一部分。因此,它擁有一組經過定義和充分測試的接口。
讓我們來查看兩個主要接口:<em >CacheManager</em> 和 <em >Cache</em>。
interface CacheManager {
Cache getCache(String name);
Collection<String> getCacheNames();
}
public interface Cache {
String getName();
Object getNativeCache();
ValueWrapper get(Object key);
<T> T get(Object key, @Nullable Class<T> type);
<T> T get(Object key, Callable<T> valueLoader);
void put(Object key, @Nullable Object value);
ValueWrapper putIfAbsent(Object key, @Nullable Object value);
void evict(Object key);
void clear();
}如我們所見,CacheManager 只是一個包裝器。它是一個應用程序中可用的緩存區域的註冊表。另一方面,Cache 對象是一個區域內的鍵值對集合。
不過,它們中沒有一個提供列出可用鍵的方法。
3. 部署
在探索所有可用鍵的訪問選項之前,讓我們定義用於我們測試應用程序的 CaffeineCacheManager:
@Configuration
@EnableCaching
public class AllKeysConfig {
@Bean
CacheManager cacheManager() {
return new CaffeineCacheManager();
}
}然後,讓我們創建一個慢速服務,該服務會在每次調用時填充緩存:
public class SlowServiceWithCache {
@CachePut(cacheNames = "slowServiceCache", key = "#name")
public String save(String name, String details) {
return details;
}
}憑藉着經理和服務的完善,我們已準備好在 slowServiceCache 區域中查找密鑰。
4. 訪問所有緩存鍵
正如我們已經學到的,<em >CacheManager</em> 不暴露任何方法來訪問所有可用的鍵。<em >Cache</em> 接口也不提供此功能。
因此,我們需要利用我們在應用程序中定義的實際緩存實現的知識。 讓我們將 Spring 的通用接口轉換為其適當的 `Caffeine` 實現。
首先我們需要注入 `CacheManager`:
@Autowired
CacheManager cacheManager;
然後,讓我們執行一些簡單的類型轉換操作以訪問原始的 `Caffeine Cache`:
CaffeineCacheManager caffeineCacheManager = (CaffeineCacheManager) cacheManager;
CaffeineCache cache = (CaffeineCache) caffeineCacheManager.getCache("slowServiceCache");
Cache<Object, Object> caffeine = cache.getNativeCache();
然後,我們調用 caffeine.asMap()。由於它是一個 map,我們可以通過簡單地調用 caffeine.asMap().keySet(): 來訪問鍵。
@Test
public void givenCaffeineCacheCachingSlowCalls_whenCacheManagerProperlyCasted_thenAllKeysAreAccessible() {
slowServiceWithCache.save("first", "some-value-first");
slowServiceWithCache.save("second", "other-value-second");
Cache<Object, Object> caffeine = getNativeCaffeineCacheForSlowService();
assertThat(caffeine.asMap().keySet()).containsOnly("first", "second");
}4. 結論
在本文中,我們學習瞭如何訪問 Spring Cache 中所有可用鍵的集合。瞭解我們正在處理的實際緩存,訪問所有可用鍵只需要進行少量的簡單類型轉換。