天天看點

springboot内置緩存:打造高性能系統緩存,緩存鍵管理+緩存配置

作者:程式員進階碼農II

緩存鍵管理

在Spring緩存中,緩存鍵的生成有兩種政策,一種是預設政策,另一種是自定義政策。

自定義鍵生成政策

我們在前面已經示範了自定義鍵的生成政策,如代碼清單6-10所示的就是一種常見的根據對象的ID來生成key的實作機制。

代碼清單6-10 自定義鍵生成示例代碼

key = "'user'.concat(#id.toString())"

public User findUserById(Long id) {}

這裡實際上使用了方法的參數來作為鍵生成的資料來源。除了上述将方法參數作為key之外,Spring還為我們提供了一個Root對象來生成key。通過該Root對象,開發人員可以擷取到本地方法調用所涉及的一組中繼資料,如表6-2所示。

springboot内置緩存:打造高性能系統緩存,緩存鍵管理+緩存配置

表6-2 Root對象所提供的中繼資料

基于Root對象,我們可以使用如代碼清單6-11所示的方式來生成同樣效果的key。

代碼清單6-11 基于Root對象的自定義鍵生成示例代碼

key = "'user'.concat(#args[0].toString())"

public User findUserById(Long id)

預設鍵生成政策

如果沒有指定key屬性,那麼Spring會幫我們自動生成鍵。預設的鍵生成政策是通過KeyGenerator生成的,KeyGenerator接口定義如代碼清單6-12所示。

代碼清單6-12 KeyGenerator接口代碼

public interface KeyGenerator {

Object generate(Object target, Method method, Object... params);

}

預設鍵生成政策的具體運作方式是這樣的:如果方法沒有參數,則使用0作為key;如果隻有一個參數,則使用該參數作為key;如果參數多于一個的話則使用所有參數的HashCode作為key。

當然,如果我們想要自定義預設鍵的生成政策,可以實作自己的KeyGenerator,然後指定Spring緩存使用的KeyGenerator為這個自定義的KeyGenerator。

緩存配置

和其他功能類似,盡管Spring為我們提供了包括XML、注解在内等多種開發方式,在本書中我們還是以最常用的注解來啟用緩存。在注解模式下想要啟用Spring内置的緩存功能,需要在配置類上添加@EnableCaching注解,如代碼清單6-13所示。

代碼清單6-13 @EnableCaching注解示例代碼

@Configuration

@EnableCaching

public class SpringCacheConfig {}

CacheManager是一個由Spring定義的用來管理Cache的核心接口。目前,Spring已經内置了一大批主流的緩存實作工具,這些工具都統一通過CacheManager進行管理。CacheManager的類層結構如圖6-1所示。

springboot内置緩存:打造高性能系統緩存,緩存鍵管理+緩存配置

圖6-1 CacheManager類層結構圖

可以看到,除了基于Java API的ConcurrentMapCacheManager之外,EhCache、Redis、Caffeine、Guava等第三方緩存工具都已經被整合進了Spring架構。如果我們想要使用其他類型的緩存,也可以自己來實作CacheManager接口,或者擴充AbstractCacheManager抽象類。

顯然,不同的緩存工具使用方法是不一樣的,是以對于不同的CacheManager實作,我們都需要設定對應的配置項。以EhCache為例,我們可以在類路徑上建立一個ehcache.xml配置檔案,并設定如代碼清單6-14所示的配置項。

代碼清單6-14 ehcache.xml示例配置檔案

<ehcache xmlns:xsi=http://www.w3.org/2001/XMLSchema

instancexsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"

updateCheck="false">

<diskStore path="java.io.tmpdir"/>

<!-- 配置預設的緩存區 -->

<defaultCache

maxElementsInMemory="10000"

eternal="false"

overflowToDisk="true"

timeToIdleSeconds="900"

timeToLiveSeconds="900"

diskPersistent="false"

memoryStoreEvictionPolicy="LRU"

diskExpiryThreadIntervalSeconds="120"/>

<!-- 配置名為user的緩存區 -->

<cache name="user"

maxElementsInMemory="100"

eternal="false"

timeToIdleSeconds="900"

timeToLiveSeconds="900"

overflowToDisk="true"

maxElementsOnDisk="10000"

diskPersistent="true"

diskExpiryThreadIntervalSeconds="120"

memoryStoreEvictionPolicy="LRU"/>

</ehcache>這裡我們設定了EhCache的正常屬性,并針對user這個緩存指定了它的記憶體中最大緩存對象數、緩存對象失效前允許存活時間等屬性。然後,在Spring Boot應用程式的application.yml配置檔案中,我們也需要指定目前使用的緩存類型為ehcache并設定對應的配置檔案位址,如代碼清單6-15所示。

代碼清單6-15 基于ehcache緩存類型的application.yml示例配置檔案

spring:

cache:

type: ehcache

ehcache:

config: classpath:ehcache.xml

而如果你使用的是Caffeine,那麼可以使用如代碼清單6-16所示的配置方法。

代碼清單6-16 基于Caffeine的配置方法示例代碼

@Configuration

public class CacheConfig {

@Bean

public CacheManager cacheManager() {

SimpleCacheManager manager = new SimpleCacheManager();

ArrayList<CaffeineCache> caches = new ArrayList<>();

caches.add(new CaffeineCache("user",

Caffeine.newBuilder().recordStats()

.expireAfterWrite(60, TimeUnit.SECONDS)

.maximumSize(100)

.build())

); manager.setCaches(caches);

return manager;

}

}

這裡,我們針對user緩存對象建立了一個CaffeineCache,并把它注冊到CacheManager中。

本文給大家講解的内容是springboot内置緩存:打造高性能系統緩存,緩存鍵管理+緩存配置

  • 下文給大家講解的是springboot内置緩存:打造高性能系統緩存,Spring緩存案例分析

繼續閱讀