緩存鍵管理
在Spring緩存中,緩存鍵的生成有兩種政策,一種是預設政策,另一種是自定義政策。
自定義鍵生成政策
我們在前面已經示範了自定義鍵的生成政策,如代碼清單6-10所示的就是一種常見的根據對象的ID來生成key的實作機制。
代碼清單6-10 自定義鍵生成示例代碼
key = "'user'.concat(#id.toString())"
public User findUserById(Long id) {}
這裡實際上使用了方法的參數來作為鍵生成的資料來源。除了上述将方法參數作為key之外,Spring還為我們提供了一個Root對象來生成key。通過該Root對象,開發人員可以擷取到本地方法調用所涉及的一組中繼資料,如表6-2所示。
表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所示。
圖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緩存案例分析