溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何使用Caffeine和Spring Boot配置多個緩存

發(fā)布時間:2022-02-28 11:25:17 來源:億速云 閱讀:614 作者:小新 欄目:開發(fā)技術(shù)

這篇文章主要介紹了如何使用Caffeine和Spring Boot配置多個緩存,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

緩存是幾乎所有應用程序性能的關(guān)鍵。有時需要分布式緩存,但并非總是如此。在許多情況下,本地緩存可以正常工作,并且不需要分布式緩存的開銷和復雜性。

因此,在許多應用程序中,包括普通的 Spring 和 Spring Boot,您可以在任何方法上使用@Cacheable,其結(jié)果將被緩存,以便下次調(diào)用該方法時,返回緩存的結(jié)果。

Spring 有一些默認的緩存管理器實現(xiàn),但外部庫總是比簡單的實現(xiàn)更好、更靈活。例如,Caffeine 是一個高性能的 Java 緩存庫。Spring Boot 帶有一個CaffeineCacheManager. 因此,理想情況下,您只需創(chuàng)建一個緩存管理器 bean 并為您的帶有@Cacheable注釋的方法緩存。

但是,提供的緩存管理器允許您僅配置一種緩存規(guī)范。緩存規(guī)范包括到期時間、初始容量、最大大小等。因此,此緩存管理器下的所有緩存都將使用單個緩存規(guī)范創(chuàng)建。緩存管理器支持預定義緩存列表以及動態(tài)創(chuàng)建的緩存,但在這兩種情況下都使用單個緩存規(guī)范。這對生產(chǎn)很少有用。作為一般規(guī)則,您必須小心使用內(nèi)置緩存管理器。

這篇文章告訴您如何使用自定義規(guī)范定義自定義緩存。但是,這些選項不支持內(nèi)置管理器支持的動態(tài)默認緩存規(guī)范用例。理想情況下,您應該能夠使用任何名稱@Cacheable并自動使用某些默認規(guī)范創(chuàng)建緩存,但您還應該可以選擇覆蓋特定緩存的名稱。

這就是為什么我決定使用比在代碼中定義所有緩存更簡單的方法,以提供更大的靈活性。它擴展了CaffeineCacheManager提供該功能:

/**
 * Extending Caffeine cache manager to allow flexible per-cache configuration
 */
public class FlexibleCaffeineCacheManagerextends CaffeineCacheManagerimplements InitializingBean {
    private Map<String, String> cacheSpecs =new HashMap<>();
 
    private Map<String, Caffeine<Object, Object>> builders =new HashMap<>();
 
    private CacheLoader cacheLoader;
 
    @Override
    public void afterPropertiesSet()throws Exception {
        for (Map.Entry<String, String> cacheSpecEntry : cacheSpecs.entrySet()) {
            builders.put(cacheSpecEntry.getKey(), Caffeine.from(cacheSpecEntry.getValue()));
        }
    }
 
    @Override
    @SuppressWarnings("unchecked")
    protected Cache<Object, Object> createNativeCaffeineCache(String name) {
        Caffeine<Object, Object> builder = builders.get(name);
        if (builder ==null) {
            return super.createNativeCaffeineCache(name);
        }
 
        if (this.cacheLoader !=null) {
            return builder.build(this.cacheLoader);
        }else {
            return builder.build();
        }
    }
 
    public Map<String, String> getCacheSpecs() {
        return cacheSpecs;
    }
 
    public void setCacheSpecs(Map<String, String> cacheSpecs) {
        this.cacheSpecs = cacheSpecs;
    }
 
    public void setCacheLoader(CacheLoader cacheLoader) {
        super.setCacheLoader(cacheLoader);
        this.cacheLoader = cacheLoader;
    }
}

簡而言之,它為每個規(guī)范創(chuàng)建一個咖啡因構(gòu)建器,并在需要新緩存時使用它而不是默認構(gòu)建器。

然后示例 XML 配置將如下所示:

<bean id="cacheManager" class="net.bozho.util.FlexibleCaffeineCacheManager">
    <property name="cacheSpecification" value="expireAfterWrite=10m"/>
    <property name="cacheSpecs">
        <map>
            <entry key="statistics" value="expireAfterWrite=1h"/>
       </map>
    </property>
</bean>

使用 Java 配置非常簡單——您只需設(shè)置cacheSpecs映射。

雖然 Spring 已經(jīng)變成了一個提供各種功能的龐大框架,但它并沒有放棄可擴展性的設(shè)計原則。

擴展內(nèi)置框架類是經(jīng)常發(fā)生的事情,它應該在每個人的工具箱中。這些類是在考慮擴展的情況下創(chuàng)建的 - 您會注意到CaffeineCacheManagerare中的許多protected方法。所以我們應該在需要的時候利用它。

感謝你能夠認真閱讀完這篇文章,希望小編分享的“如何使用Caffeine和Spring Boot配置多個緩存”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識等著你來學習!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI