在 Spring Cache 中获取 Caffeine 缓存的所有 KEY

1、概览

在本文中,我们将学习如何在使用 Spring Cache 时获取 Caffeine 缓存中的所有缓存 KEY。

2、Spring Cache

缓存(Cache)是 Spring Framework 不可分割的一部分。从 3.1 版本开始,它就是 Spring 生态系统的一部分。因此,它拥有一套定义明确、久经考验的接口。

让我们来看看其中两个主要接口: CacheManagerCache

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、配置

先定义测试程序使用的 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

由于 CacheManagerCache 都没有提供获取所有缓存 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、总结

在本文中,我们学习了如何从与 Spring Cache 配合使用的 Caffeine 缓存中获取所有可用 KEY 的集合。

举一反三,当你在 Spring Cache 中使用其他的缓存实现(Redis、Ehcache)时,也可以通过这种方式来获取到底层的实现类,并使用其特殊的方法。


参考:https://www.baeldung.com/spring-boot-caffeine-spring-get-all-keys