學習ehcache文檔:java
介紹:Ehcache是一個開源的項目,用來提升性能的基於標準化的緩存,無需使用數據庫,簡化了可擴展性。他是最普遍使用的基於java的緩存,由於他是強壯的,被證明的,功能全面的,而且能夠和其餘的流行的庫和框架整合。Ehcache從進程內到進程內外以TB級的緩存混合部署。spring
目前最新的可用版本是:3.7。這個版本增長了堆上的性能。須要使用java8+。在接下來的幾個月裏能夠看到3.x系列的功能的持續快速的改進。數據庫
Ehcache3介紹:api
開始使用Ehcache3緩存
引入Ehcache到項目裏,要麼使用他的最新的API,也可使用javax.cache API。安全
使用 the core Ehcache v3 API,Ehcache 3有一個流線型的、現代化的類型安全API(和配置),與Ehcache 2.x相比,它將極大地改善您的編碼體驗。服務器
引入jarsapp
<dependency> <groupId>org.ehcache</groupId> <artifactId>ehcache</artifactId> <version>3.7.0</version> </dependency>
使用Ehcache 3 API:框架
CacheManager cacheManager = CacheManagerBuilder.newCacheManagerBuilder() .withCache("preConfigured", CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, String.class, ResourcePoolsBuilder.heap(100)) .build()) .build(true); Cache<Long, String> preConfigured = cacheManager.getCache("preConfigured", Long.class, String.class); Cache<Long, String> myCache = cacheManager.createCache("myCache", CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, String.class, ResourcePoolsBuilder.heap(100)).build()); myCache.put(1L, "da one!"); String value = myCache.get(1L); cacheManager.close();
除了上面的,還須要the JSR-107 API,導入jars性能
<dependency> <groupId>javax.cache</groupId> <artifactId>cache-api</artifactId> <version>1.1.0</version> </dependency>
文檔:
配置Ehcache:java配置能夠經過提供一個API來很容易的獲得。和之前的版本同樣,處理cache最權威的方式是經過一個CacheManage。
CacheManager cacheManager = CacheManagerBuilder.newCacheManagerBuilder() .withCache("preConfigured", CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, String.class, ResourcePoolsBuilder.heap(10))) .build(); cacheManager.init(); Cache<Long, String> preConfigured = cacheManager.getCache("preConfigured", Long.class, String.class); Cache<Long, String> myCache = cacheManager.createCache("myCache", CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, String.class, ResourcePoolsBuilder.heap(10))); myCache.put(1L, "da one!"); String value = myCache.get(1L); cacheManager.removeCache("preConfigured"); cacheManager.close();
1.CacheManagerBuilder.newCacheManagerBuilder(),org.ehcache.config.builders.CacheManagerBuilder.newCacheManagerBuilder這個靜態方法返回了一個新的org.ehcache.config.builders.CacheManagerBuilder的實例。
2..withCache("preConfigured",CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, String.class, ResourcePoolsBuilder.heap(10))) ,使用這個builder去定義一個叫「preConfigured」的緩存。當在CacheManager實例上,cacheManager.build()被調用時,這個緩存將被建立。第一個string參數是緩存的別名,他被用於從CacheManager來檢索緩存。第二個參數org.ehcache.config.CacheConfiguration被用來配置這個緩存。咱們在rg.ehcache.config.builders.CacheConfigurationBuilder上使用newCacheConfigurationBuilder()靜態方法來建立一個默認的配置。
3..build(),最後調用build()返回了一個徹底實例化可是尚未初始化的CacheManager。
4.cacheManager.init(),使用CacheManager以前,他須要被初始化,可使用兩種方式的一種:在CacheManager實例上調用CacheManager.init()或者調用CacheManagerBuilder.build(boolean init)方法,boolean參數設爲true。
5.cacheManager.getCache("preConfigured", Long.class, String.class);
一個緩存是經過他的別名,key的類型,value的類型來索引的。好比說,要去獲得在第二步聲明的緩存,你須要他的別名="preConfigured",keyType=Long.class
,valueType=String.class。爲了類型安全,咱們要求傳入key和value的類型。若是咱們指望的東西有不一樣的地方,CacheManager會在應用的生命週期中儘早的拋出一個ClassCastException。這樣能夠防止the Cache被混亂的類型污染。
6.Cache<Long, String> myCache = cacheManager.createCache("myCache",
CacheManager能夠根據須要建立新的Cache實例。和步驟2CacheConfiguration同樣,他也須要傳入一個別名。添加進來的已經被實例化和初始化的Cache經過CacheManager.getCache的API被返回或者存取。
7.myCache.put(1L, "da one!");
最近添加過的Cache能夠被存入條目裏,這個條目是由鍵值對組成。這個put方法第一個參數是key,第二個參數是value。記得這個key和value的類型必須和被定義在CacheConfiguration裏的類型同樣。此外,鍵必須是惟一的,只能和一個值關聯。
8.String value = myCache.get(1L);
經過調用cache.get(key)方法從緩存中檢索值。他只接受一個key,返回相關聯的value。若是沒有相關聯的value,返回null。
9.cacheManager.removeCache("preConfigured");
咱們能夠刪除一個給定的Cache,CacheManager不只會刪除對緩存的引用,還會關閉它。這個緩存會釋放全部的本地的臨時資源(好比內存)。這個緩存的引用變得不可用。
10.cacheManager.close();
爲了釋放全部的臨時資源(內存,線程),一個CacheManager提供他所管理的緩存實例,調用CacheManager.close(),它會依次關閉全部的緩存實例。
這有3個重要的事情:
try(CacheManager cacheManager = newCacheManagerBuilder() .withCache("preConfigured", newCacheConfigurationBuilder(Long.class, String.class, heap(10))) .build(true)) { // Same code as before [...] }
1.CacheManager 實現了Closeable,因此能夠自動地經過try-with-resources關閉。CacheManage必須關閉的乾淨。.在finally塊中,使用try-with-resources或者其餘更常見的方式來關閉
2.builders有不一樣的名稱,你可使用靜態導入全部。
3.CacheManage使用build(true)來初始化。
使用XML配置:能夠經過建立xml文件配置一個CacheManager
<config xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns='http://www.ehcache.org/v3' xsi:schemaLocation="http://www.ehcache.org/v3 http://www.ehcache.org/schema/ehcache-core.xsd"> <cache alias="foo"> <key-type>java.lang.String</key-type> <value-type>java.lang.String</value-type> <resources> <heap unit="entries">20</heap> <offheap unit="MB">10</offheap> </resources> </cache> <cache-template name="myDefaults"> <key-type>java.lang.Long</key-type> <value-type>java.lang.String</value-type> <heap unit="entries">200</heap> </cache-template> <cache alias="bar" uses-template="myDefaults"> <key-type>java.lang.Number</key-type> </cache> <cache alias="simpleCache" uses-template="myDefaults" /> </config>
1.聲明一個叫foo的緩存
2.foo的key,value爲string類型,默認是object
3.<heap unit="entries">20</heap>
在堆上容納2000entries.
4.<offheap unit="MB">10</offheap> 500MB的離堆內存
5.<cache-template>這個元素讓你建立一個抽象的配置,<cache>能夠對他擴展
6.bar是一個cache,bar使用叫'myDefaults'的<cache-template>,重寫了他的key類型
7.simpleCache是另外一個cache,它使用了myDefaults配置他惟一的CacheConfiguration。
爲了去解析XML配置,可使用XmlCOnfiguration類:
URL myUrl = getClass().getResource("/my-config.xml"); Configuration xmlConfig = new XmlConfiguration(myUrl); CacheManager myCacheManager = CacheManagerBuilder.newCacheManager(xmlConfig);
1.獲得XML文件的本地的URL
2.實例化Configuration類
3.使用靜態的org.ehcache.config.builders.CacheManagerBuilder.newCacheManager(org.ehcache.config.Configuration),讓你建立你的CacheManage實例,這個實例用於從XMLConfiguration中使用Configuration.
建立一個支持集羣的緩存管理器
要啓用Terracotta集羣,首先必須啓動配置了集羣存儲的Terracotta服務器。另外,爲了建立有集羣支持的cachemanage,你必須提供集羣服務配置。
CacheManagerBuilder<PersistentCacheManager> clusteredCacheManagerBuilder = CacheManagerBuilder.newCacheManagerBuilder() .with(ClusteringServiceConfigurationBuilder.cluster(URI.create("terracotta://localhost/my-application")) .autoCreate()); PersistentCacheManager cacheManager = clusteredCacheManagerBuilder.build(true); cacheManager.close();
1.CacheManagerBuilder.newCacheManagerBuilder()
返回org.ehcache.config.builders.CacheManagerBuilde 實例。
2..with(ClusteringServiceConfigurationBuilder.cluster(URI.create("terracotta://localhost/my-application"))
使用ClusteringServiceConfigurationBuilder的靜態方法.cluster(URL),是爲了鏈接cacheManage到URL地址上的集羣存儲,返回一個集羣的服務配置builer實例。在例子中的URL指向了Terracotta服務器上具備集羣存儲標識符my-application的集羣存儲(假設服務器運行在本地主機和端口9410上)。若是集羣存儲還不存在,query-param自動建立將在服務器中建立集羣存儲。
3.autoCreate():返回一個初始化的cacheManage,他能夠用來建立集羣緩存。
4.PersistentCacheManager cacheManager = clusteredCacheManagerBuilder.build(true);
若是集羣存儲不存在的話會自動建立它。
5.cacheManager.close():關閉cacheManager。
存儲層
Ehcache3,做爲一個之前的版本,提供了一個分層模型,容許在較慢的層(一般更豐富)存儲大量數據。其理念是,存儲更快,資源更少,可是是最熱門數據的首選位置。較少熱(較少使用)的數據被移動到更加豐富可是更慢的層。更熱的數據移動到更快的層
一個經典的例子是使用帶有持久磁盤存儲的3層。
PersistentCacheManager persistentCacheManager = CacheManagerBuilder.newCacheManagerBuilder() .with(CacheManagerBuilder.persistence(new File(getStoragePath(), "myData"))) .withCache("threeTieredCache", CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, String.class, ResourcePoolsBuilder.newResourcePoolsBuilder() .heap(10, EntryUnit.ENTRIES) .offheap(1, MemoryUnit.MB) .disk(20, MemoryUnit.MB, true) ) ).build(true); Cache<Long, String> threeTieredCache = persistentCacheManager.getCache("threeTieredCache", Long.class, String.class); threeTieredCache.put(1L, "stillAvailableAfterRestart"); persistentCacheManager.close();
1.PersistentCacheManager persistentCacheManager = CacheManagerBuilder.newCacheManagerBuilder()
.with(CacheManagerBuilder.persistence(new File(getStoragePath(), "myData")))
若是你想要使用磁盤存儲(好比持久化緩存實例),你須要提供一個位置,以便將數據存儲到CacheManagerBuilder.persistence()靜態方法的磁盤上。
2.ResourcePoolsBuilder.newResourcePoolsBuilder()
.heap(10, EntryUnit.ENTRIES)
給堆區定義一個資源池。他將成爲你的更快的可是更緩慢的池。
3..offheap(1, MemoryUnit.MB)
爲離堆區定義一個資源池,很快並且大。
4..disk(20, MemoryUnit.MB, true)
爲磁盤定義一個持久化的資源池。最後一個參數是true
5.threeTieredCache.put(1L, "stillAvailableAfterRestart");
JVM重啓後全部的緩存值也是可用的(假設經過close()關閉CacheManager)。
數據新鮮度
數據的新鮮度經過過時時間(Expiry)來控制。下面的說明怎麼配置生命週期
CacheConfiguration<Long, String> cacheConfiguration = CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, String.class, ResourcePoolsBuilder.heap(100)) .withExpiry(ExpiryPolicyBuilder.timeToLiveExpiration(Duration.ofSeconds(20))) .build();
1.過時是在緩存級別配置的,因此首先定義一個緩存配置
2.而後添加上一個Expiry,這裏使用預約義的生存時間,配置須要的Duration。