巧記java本地快取encache
阿新 • • 發佈:2019-12-31
JVM快取encache
在JVM快取中有一個經常使用的快取框架,就是encache
,所以這裡對encache進行一些介紹,本文是基於版本3.8來介紹一些新特性。encache
主要由三個元件組成CacheManager
、Cache
和CacheConfiguration
。單臺cahce層次結構如下:
CacheManager結構
Cache結構
CacheConfiguration配置結構
encache的分層結構
在正式使用encache
的時候,我們先來瞭解一下其快取策略,也就是其快取的值究竟是存在哪裡的,這有助於我們理解encache
。其有三種快取策略分別是堆內快取、堆外快取、磁碟快取,分別對應的分層結構配置是heap
offheap
、disk
。
如何使用?
引入依賴:
<dependency>
<groupId>org.ehcache</groupId>
<artifactId>ehcache</artifactId>
<version>3.8.0</version>
</dependency>
複製程式碼
如果使用到叢集:
<dependency>
<groupId>org.ehcache</groupId>
<artifactId>ehcache-clustered</artifactId>
<version>3.8.0</version>
</dependency>
複製程式碼
用java程式碼配置
我們可以使用java程式碼來獲取Cache
例項。
CacheManager cacheManager = CacheManagerBuilder.newCacheManagerBuilder()//宣告一個cacheBuilder
.withCache("myCache",CacheConfigurationBuilder
.newCacheConfigurationBuilder(String.class,String.class,ResourcePoolsBuilder.heap(20)))//宣告一個容量為20的堆內快取
.build(true);
Cache<String,String> myCache = cacheManager.getCache("myCache",String.class);//獲取這個cache
myCache.put("key1","v1");//使用
System.out.println(myCache.get("key1"));
//移除
cacheManager.removeCache("myCache");
cacheManager.close();
複製程式碼
用xml配置
使用一個xml來配置一個CacheManager
,xml配置見cache.xml。構造程式碼如下:
//獲取配置資源
URL configUrl = new XmlGetStarted().getClass().getResource("/cache.xml");
//從xmlConfig構造一個CacheManger並且初始化
Configuration xmlConfig = new XmlConfiguration(configUrl);
CacheManager cacheManager = CacheManagerBuilder.newCacheManager(xmlConfig);
cacheManager.init();
Cache<String,String> cache = cacheManager.getCache("c1",String.class);
cache.put("K","V");
System.out.println(cache.get("K"));
複製程式碼
建立一個支援叢集的CacheManager
Encache
可以藉助terracotta支援叢集。以下是支援叢集的程式碼:
CacheManagerBuilder<PersistentCacheManager> clusteredCacheManagerBuilder =
CacheManagerBuilder.newCacheManagerBuilder()
.with(ClusteringServiceConfigurationBuilder.cluster(URI.create("terracotta://localhost/my-application"))
.autoCreate(c -> c));
PersistentCacheManager cacheManager = clusteredCacheManagerBuilder.build(true);
cacheManager.close();
複製程式碼
資料更新
在配置CacheConfiguration
時,我們可以配置快取的Expiry
,也就是過期策略,具體配置程式碼如下:
CacheConfigurationBuilder
.newCacheConfigurationBuilder(String.class,ResourcePoolsBuilder.heap(20))
.withExpiry(ExpiryPolicyBuilder.timeToIdleExpiration(Duration.ofHours(20)));
複製程式碼
encache
過期策略有三種,分別是:timeToLiveExpiration
:從建立cache entry開始計算,一段時間後過期timeToIdleExpiration
: 從最後一次訪問cache entry開始計算,只有heap裡的cache entry生效noExpiration
: 永不過期
將快取資料序列化到磁碟
可以使用encache
分層結構的disk
來序列化資料。
long begin = System.currentTimeMillis();
PersistentCacheManager persistentCacheManager = CacheManagerBuilder.newCacheManagerBuilder()
.with(CacheManagerBuilder.persistence(new File(getStoragePath(),"myData")))//序列化到磁碟的路徑
.withCache("persistent-cache",CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class,ResourcePoolsBuilder.newResourcePoolsBuilder()
.disk(500,MemoryUnit.MB,true)
)//宣告單個cache的配置
)
.build(true);
Cache<Long,String> cache = persistentCacheManager.getCache("persistent-cache",Long.class,String.class);
for (int i=0;i<SIZE;i++){
cache.put(Long.valueOf(i),String.valueOf(i));
System.out.println(cache.get(Long.valueOf(i)));
}
System.out.println("cost time:"+(System.currentTimeMillis()-begin));
persistentCacheManager.close();
複製程式碼
這樣,在persistentCacheManager.close()
就會將快取自動重新整理到磁碟,啟動時會將磁碟中的資料進行載入。