知識庫 / Spring / Spring Boot RSS 訂閱

Caffeine Cache 在 Spring Boot 中獲取所有緩存鍵

Spring Boot
HongKong
4
11:41 AM · Dec 06 ,2025

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 中所有可用鍵的集合。瞭解我們正在處理的實際緩存,訪問所有可用鍵只需要進行少量的簡單類型轉換。

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.