文章發表在我的部落格上:https://blog.ysboke.cn/archives/124.html
什麼是ehcache
純Java的程式內快取,直接在JVM虛擬機器中快取,速度非常快。快取有兩級,記憶體儲存完了自動存到磁碟上。
資料可持久化在磁碟上,vm(虛擬機器)重啟後資料恢復
和redis比怎麼樣
redis都聽過,記憶體資料庫,ehcache的快取是jvm級別的,速度超過redis。redis通過socket訪問快取資料,效率沒ehcache高。
對於分散式和叢集,redis有成熟的方案,而ehcache在分散式和叢集情況下的快取恢復、資料快取的支援不是很好。
如果是大型系統,存在快取共享、分散式部署、快取內容很大的,建議用redis。
二者可以共同使用。
使用方法
1、在pom.xml裡新增依賴:
<!--引入Mybatis的ehCache的適配-->
<dependency>
<groupId>org.mybatis.caches</groupId>
<artifactId>mybatis-ehcache</artifactId>
<version>1.0.3</version>
</dependency>
2、在src/main/java/resources下建立固定名稱的ehcache.xml檔案:
<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
updateCheck="false"
monitoring="autodetect"
dynamicConfig="true">
<!-- 當記憶體中不夠儲存時,儲存到指定資料在磁碟中的儲存位置。 -->
<diskStore path="cache" />
<!-- 預設快取,當藉助CacheManager.add("demoCache")建立Cache時,EhCache便會採用<defalutCache/>指定的的管理策略 -->
<defaultCache
maxElementsInMemory="3000"
eternal="false"
copyOnRead="true"
copyOnWrite="true"
timeToIdleSeconds="3600"
timeToLiveSeconds="3600"
overflowToDisk="true"
diskPersistent="true">
<copyStrategy class="com.moti.utils.MyCopyStrategy"/>
</defaultCache>
<!-- 自定義的快取策略 -->
<cache name="HelloWorldCache"
maxElementsInMemory="1000"
eternal="false"
timeToIdleSeconds="5"
timeToLiveSeconds="5"
overflowToDisk="false"
memoryStoreEvictionPolicy="LRU"/>
</ehcache>
必須的屬性:
- maxElementsInmemory—— 在記憶體中快取的element的最大數目
- maxElementsOnDisk——在磁碟上快取的elements的最大數目,0表示不限制
- eternal——設定快取的elements是否永遠不過期。如果為true,則快取的資料始終有效,如果為false那麼還要根據timeToIdleSeconds,timeToLiveSeconds判斷
- overFlowToDisk——設定當記憶體快取溢位的時候是否將過期的element快取到磁碟上
可選的屬性:
- timeToIdleSeconds——可閒置時間。當快取在EhCache中的資料前後兩次訪問的時間超過timeToIdleSeconds的屬性取值時,這些資料便會刪除,預設值是0,也就是可閒置時間無窮大
- timeToLiveSeconds——快取element的有效生命期,預設是0。也就是element存活時間無窮大
- diskSpoolBufferSizeMB——設定DiskStore(磁碟快取)的快取區大小.預設是30MB.每個Cache都應該有自己的一個緩衝區.
- diskPersistent——在VM重啟的時候是否啟用磁碟儲存EhCache中的資料,預設是false。
- diskExpiryThreadIntervalSeconds——磁碟快取的清理執行緒執行間隔,預設是120秒。每個120s,相應的執行緒會進行一次EhCache中資料的清理工作
- memoryStoreEvictionPolicy——當記憶體快取達到最大,有新的element加入的時候, 移除快取中element的策略。預設是LRU(最近最少使用),可選的有LFU(最不常使用)和FIFO(先進先出)
- clearOnFlush——記憶體達到最大時是否清除
3、使用示例
public class Test1 {
@Test
public void test1() {
// 1. 建立快取管理器
CacheManager cacheManager = CacheManager.create("./src/main/resources/ehcache.xml");
// 2. 獲取快取物件
Cache cache = cacheManager.getCache("HelloWorldCache");
// 3. 建立元素
Element element = new Element("key1", "value1");
// 4. 將元素新增到快取
cache.put(element);
// 5. 獲取快取
Element value = cache.get("key1");
System.out.println(value);
System.out.println(value.getObjectValue());
// 6. 刪除元素
cache.remove("key1");
Person p1 = new Person("小明",18,"杭州");
Element pelement = new Element("xm", p1);
cache.put(pelement);
Element pelement2 = cache.get("xm");
System.out.println(pelement2.getObjectValue());
System.out.println(cache.getSize());
// 7. 重新整理快取
cache.flush();
// 8. 關閉快取管理器
cacheManager.shutdown();
}
}