1、概览 {#1概览}
在本文中,我们将学习如何在使用 Spring Cache 时获取 Caffeine 缓存中的所有缓存 KEY。
2、Spring Cache {#2spring-cache}
缓存(Cache)是 Spring Framework 不可分割的一部分。从 3.1 版本开始,它就是 Spring 生态系统的一部分。因此,它拥有一套定义明确、久经考验的接口。
让我们来看看其中两个主要接口: CacheManager
和 Cache
:
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
对象则是缓存内的一组键值对。
不过,它们都没有提供列出可用 KEY 的方法。
3、配置 {#3配置}
先定义测试程序使用的 CaffeineCacheManager
:
@Configuration
@EnableCaching
public class AllKeysConfig {
@Bean
CacheManager cacheManager() {
return new CaffeineCacheManager();
}
}
然后,让我们创建一个 SlowServiceWithCache
,在每次调用时填充缓存:
public class SlowServiceWithCache {
@CachePut(cacheNames = "slowServiceCache", key = "#name")
public String save(String name, String details) {
return details;
}
}
就绪后,我们就可以在缓存 slowServiceCache
中查找 key 了。
4、访问所有缓存 KEY {#4访问所有缓存-key}
由于 CacheManager
和 Cache
都没有提供获取所有缓存 KEY 的方法。
因此,我们需要获取到应中实际使用的缓存实现,也就是要将 Spring 的通用接口转换为相应的 Caffeine
实现。
首先,注入 CacheManager
:
@AutowiredCacheManager 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()
就能访问 key 值:
@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、总结 {#4总结}
在本文中,我们学习了如何从与 Spring Cache 配合使用的 Caffeine 缓存中获取所有可用 KEY 的集合。
举一反三,当你在 Spring Cache 中使用其他的缓存实现(Redis、Ehcache)时,也可以通过这种方式来获取到底层的实现类,并使用其特殊的方法。
参考:https://www.baeldung.com/spring-boot-caffeine-spring-get-all-keys