【Cache】- Ehcache 基本操作
阿新 • • 發佈:2019-03-04
Ehcache 結構層次: CacheManager、Cache、Element
- CacheManager:快取管理器,主要負責Cache物件的建立、回收等
- Cache:主要負責Element元素的統一管理
- Element:元素,可以理解成快取資料的小單元,每個單元都通過Map的形式進行儲存,是快取資料的實際攜帶者
基礎案例:
package com.zhiwei.ehcache; import java.util.List; import java.util.Map; import net.sf.ehcache.Cache; import net.sf.ehcache.CacheManager; import net.sf.ehcache.Element; /** * CacheManager:快取管理器:負責Cache的建立、銷燬、回收等操作:一般只對應一個ehcache.xml檔案,避免衝突 * Cache:快取物件:管理Element物件:一個cache對應多個element * element:實際快取資料的攜帶者 * * 注意:Ehcache3.0以上的版本的使用方式和這裡使用的2.1有些區別 * @author Yang Zhiwei */ public class MainTest { @SuppressWarnings("unchecked") public static void main(String[] args) { //建立快取管理器的單例物件 CacheManager manager = CacheManager.newInstance("src/com/zhiwei/ehcache/ehcache.xml"); /**使用預設配置建立快取管理器 *CacheManager defauleManager=manager.create(); *System.out.println(defauleManager.getActiveConfigurationText()); */ //快取管理器獲取Cache物件,注意Cache物件需要在ehcaceh.xml進行配置 Cache cache = manager.getCache("TestCache"); System.out.println("TestCache記憶體回收策略:"+cache.getMemoryStoreEvictionPolicy().getName()); //獲取記憶體回收策略 //建立攜帶資料的Element物件:如果某些引數指明則使用預設配置 Element element01 = new Element("key01", "This is my first cache data!"); Element element02 = new Element("key02","This is my second cache data!"); System.out.println("預設快取空閒時間:"+element01.getTimeToIdle()); //將資料存入快取 cache.put(element01); cache.put(element02); //獲取element01快取元素的k-v Object key= element01.getObjectKey(); Object value = element01.getObjectValue(); System.out.println("element01:"+key+"--"+value); //Cache管理Element物件 Element element=cache.get("key01"); System.err.println("自定義快取空閒時間:"+element.getTimeToIdle()); List<String> keys=cache.getKeys(); System.out.println("cache快取物件的keys:"+keys); //通過指定的key集合獲取快取資料物件 Map<Object,Element> map=cache.getAll(keys); System.out.println(map); cache.flush(); //快取重新整理:將資料寫入本地磁碟 System.out.println("快取元素個數:"+cache.getSize()); //獲取快取的資料塊個數 cache.dispose(); //釋放快取cache管理的快取資料塊 manager.removeAllCaches(); //快取管理器清空所有快取cache物件 manager.shutdown(); //關閉快取管理器 } }
ehcache配置檔案:
<?xml version="1.0" encoding="UTF-8"?> <ehcache> <!--磁碟快取本地目錄:JVM系統變數 windows不同系統的路徑可能不一致,win10的路徑: C:\Users\squirrel\AppData\Local\Temp (可以通過System.getProperty("java.io.tmpdir")檢視) --> <diskStore path="java.io.tmpdir"/> <!-- maxEntriesLocalHeap:對記憶體最大快取個數:0標識無限制 eternal:快取物件是否永久有效:優先順序比timeout高 timeToIdleSeconds:空閒時間設定,過期直接銷燬 timeToLiveSeconds:快取物件存活期 maxEntriesLocalDisk:磁碟中的最大物件數:0標識無限制 diskExpiryThreadIntervalSeconds:快取檢測事件間隔,定時處理已快取的資料元素 diskSpoolBufferSizeMB:磁碟快取區大小 memoryStoreEvictionPolicy:記憶體回收策略 LRU:least recently used:最近最少使用 LFU: least Frequently used:最少使用 FIFO: First In First Out:先進先出:佇列形式 --> <defaultCache maxEntriesLocalHeap="10000" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" diskSpoolBufferSizeMB="30" maxEntriesLocalDisk="10000000" diskExpiryThreadIntervalSeconds="120" memoryStoreEvictionPolicy="LRU"> <persistence strategy="localTempSwap"/> </defaultCache> <!-- 配置快取物件Cache:cachaManaget通過快取名稱獲取快取物件 --> <cache name="TestCache" maxEntriesLocalHeap="10000" maxEntriesLocalDisk="1000" eternal="false" diskSpoolBufferSizeMB="20" timeToIdleSeconds="300" timeToLiveSeconds="600" memoryStoreEvictionPolicy="LFU" transactionalMode="off"> <persistence strategy="localTempSwap"/> </cache> </ehcache>
結果:
TestCache記憶體回收策略:LFU
預設快取空閒時間:0
element01:key01--This is my first cache data!
自定義快取空閒時間:300
cache快取物件的keys:[key02, key01]
{key02=[ key = key02, value=This is my second cache data!, version=1, hitCount=1, CreationTime = 1482130695701, LastAccessTime = 1482130695701 ], key01=[ key = key01, value=This is my first cache data!, version=1, hitCount=2, CreationTime = 1482130695701, LastAccessTime = 1482130695701 ]}
快取元