在Spring Boot中获取所有缓存的Caffeine键

2023/05/11

1. 概述

在本文中,我们将学习如何在与Spring的Cache抽象层一起使用时获取Caffeine缓存中的所有缓存键。

2. Spring缓存

缓存是Spring框架不可或缺的一部分。自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对象是区域内的一组键值对。

但是,它们都没有提供列出可用键的方法

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. 访问所有缓存键

正如我们已经了解到的,CacheManager没有公开任何方法来访问所有可用的键。Cache接口也没有。

因此,我们需要使用我们在应用程序中定义的实际缓存实现的知识。让我们将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一起使用的Caffeine缓存中访问所有可用键的集合。了解我们正在处理的实际缓存后,访问所有可用键只需要几个简单的强制转换操作。

与往常一样,本教程的完整源代码可在GitHub上获得。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章