EHCache 緩存全接觸
EHCache 是一個純java的,在Hibernate2.1充當可插入的的在進程中的緩存,它具有以下緩存,最小的依賴性,全面的文特性:快速,簡單,豐富的文檔和測試用例。
官方網站 http://ehcache.sourceforge.net/
ehcache-1.2 cacheNames 列表的取得;
方法一:
- CacheManager.create();
- String[] cacheNames = CacheManager.getInstance().getCacheNames();
方法二:
- CacheManager manager = new CacheManager();
- String[] cacheNames = manager.getCacheNames();
方法三:
- CacheManager manager1 = new CacheManager('src/config/ehcache1.');
- CacheManager manager2 = new CacheManager('src/config/ehcache2.xml');
- String[] cacheNamesForManager1 = manager1.getCacheNames();
- String[] cacheNamesForManager2 = manager2.getCacheNames();
ehcache-1.2 管理器各種建立的方法:
方法一:
- CacheManager manager = new CacheManager();
方法二:
- CacheManager manager = new CacheManager('src/config/ehcache.xml');
方法三:
- URL url = getClass().getResource('/anotherconfigurationname.xml');
- CacheManager manager = new CacheManager(url);
方法四:
- InputStream fis = new FileInputStream(new File('src/config/ehcache.xml').getAbsolutePath());
- try {
- CacheManager manager = new CacheManager(fis);
- } finally {
- fis.close();
- }
添加和刪除緩存元素
設置一個名為test 的新cache,test屬性為默認
- CacheManager singletonManager = CacheManager.create();
- singletonManager.addCache('testCache');
- Cache test = singletonManager.getCache('testCache');
設置一個名為test 的新cache,并定義其屬性
- CacheManager singletonManager = CacheManager.create();
- Cache memoryOnlyCache = new Cache('testCache', 5000, false, false, 5, 2);
- manager.addCache(memoryOnlyCache);
- Cache test = singletonManager.getCache('testCache');
Cache 屬性說明:
構造函數:
public Cache(java.lang.String name,
int maxElementsInMemory,
boolean overflowToDisk,
boolean eternal,
long timeToLiveSeconds,
long timeToIdleSeconds)
參數說明:
name - 元素名字。
maxElementsInMemory - 設定內存中創建對象的最大值。
overflowToDisk - 設置當內存中緩存達到 maxInMemory 限制時元素是否可寫到磁盤
上。
eternal - 設置元素(譯注:內存中對象)是否永久駐留。如果是,將忽略超
時限制且元素永不消亡。
timeToIdleSeconds - 設置某個元素消亡前的停頓時間。
也就是在一個元素消亡之前,兩次訪問時間的最大時間間隔值。
這只能在元素不是永久駐留時有效(譯注:如果對象永恒不滅,則
設置該屬性也無用)。
如果該值是 0 就意味著元素可以停頓無窮長的時間。
timeToLiveSeconds - 為元素設置消亡前的生存時間。
也就是一個元素從構建到消亡的最大時間間隔值。
這只能在元素不是永久駐留時有效。
刪除緩存元素:
- CacheManager singletonManager = CacheManager.create();
- singletonManager.removeCache('test');
關閉緩存管理器 CacheManager
- CacheManager.getInstance().shutdown();
對于緩存對象的操作:
放入一個簡單的對象到緩存元素;
- Cache cache = manager.getCache('sampleCache1');
- Element element = new Element('key1', 'value1');
- cache.put(element);
得到一個序列化后的對象屬性值;
- Cache cache = manager.getCache('sampleCache1');
- Element element = cache.get('key1');
- Serializable value = element.getValue();
得到一個沒有序列化后的對象屬性值;
- Cache cache = manager.getCache('sampleCache1');
- Element element = cache.get('key1');
- Object value = element.getObjectValue();
刪除一個對象從元素;
- Cache cache = manager.getCache('sampleCache1');
- Element element = new Element('key1', 'value1'
- cache.remove('key1');
對于永固性磁盤存儲,立即存儲到磁盤:
- Cache cache = manager.getCache('sampleCache1');
- cache.flush();
獲得緩存大小:
得到緩存的對象數量;
- Cache cache = manager.getCache('sampleCache1');
- int elementsInMemory = cache.getSize();
得到緩存對象占用內存的數量
- Cache cache = manager.getCache('sampleCache1');
- long elementsInMemory = cache.getMemoryStoreSize();
得到緩存對對象占用磁盤的數量
- Cache cache = manager.getCache('sampleCache1');
- long elementsInMemory = cache.getDiskStoreSize();
關于緩存的讀取和丟失的記錄
得到緩存讀取的命中次數;
- Cache cache = manager.getCache('sampleCache1');
- int hits = cache.getHitCount();
得到內存中緩存讀取的命中次數;
- Cache cache = manager.getCache('sampleCache1');
- int hits = cache.getMemoryStoreHitCount();
得到磁盤中緩存讀取的命中次數;
- Cache cache = manager.getCache('sampleCache1');
- int hits = cache.getDiskStoreCount();
得到緩存讀取的丟失次數;
- Cache cache = manager.getCache('sampleCache1');
- int hits = cache.getMissCountNotFound();
得到緩存讀取的已經被銷毀的對象丟失次數;
- Cache cache = manager.getCache('sampleCache1');
- int hits = cache.getMissCountExpired();
--------------------------
----------簡單例子------------
--------------------------
實戰:
XML文件格式:
- maxElementsInMemory='10000'
- eternal='false'
- timeToIdleSeconds='120'
- timeToLiveSeconds='120'
- overflowToDisk='true'
- diskPersistent='false'
- diskExpiryThreadIntervalSeconds='120'
- memoryStoreEvictionPolicy='LRU'
- />
- maxElementsInMemory='10000'
- eternal='false'
- overflowToDisk='true'
- timeToIdleSeconds='2'
- timeToLiveSeconds='3'
- memoryStoreEvictionPolicy='LFU'
- />
源碼:
- import java.io.Serializable;
- import net.sf.ehcache.Cache;
- import net.sf.ehcache.CacheManager;
- import net.sf.ehcache.Element;
- /**
- #############################################################################
- # DESCRIBE ehcache 緩存操作DEMO
- # AUTHOR 悠~游
- # DATE 2006-7-10
- # COMPANY FLX
- # PORJECT ehcache-demo
- #############################################################################
- */
- public class Demo {
- static CacheManager manager= new CacheManager();
- /**
- *##############################################################################
- *
- * @DESCRIBE
- * @param args
- * @throws InterruptedException
- *
- *##############################################################################
- */
- public static void main(String[] args) throws InterruptedException {
- String[] cacheNames = manager.getCacheNames();
- System.out.println('讀取的緩存列表為:');
- for(int i=0;i System.out.println('-- '+(i+1)+' '+cacheNames[i]);
- }
- Cache cache = manager.getCache('cache1');
- Element element = new Element('key1', 'value1');
- cache.put(element);
- element = cache.get('key1');
- Serializable value = element.getValue();
- System.out.println('序列化后的值為:'+value.toString());
- element = cache.get('key1');
- Object value1 = element.getObjectValue();
- System.out.println('未序列化的值為:'+value1.toString());
- int elementsInMemory = cache.getSize();
- System.out.println('得到緩存的對象數量:'+elementsInMemory);
- long elementsInMemory1 = cache.getMemoryStoreSize();
- System.out.println('得到緩存對象占用內存的數量:'+elementsInMemory1);
- long elementsInMemory2 = cache.getDiskStoreSize();
- System.out.println('得到緩存對對象占用磁盤的數量:'+elementsInMemory2);
- int hits = cache.getHitCount();
- System.out.println('得到緩存讀取的命中次數:'+hits);
- int hits1 = cache.getMemoryStoreHitCount();
- System.out.println('得到內存中緩存讀取的命中次數:'+hits1);
- int hits2 =cache.getDiskStoreHitCount();
- System.out.println('得到磁盤中緩存讀取的命中次數:'+hits2);
- int hits3 = cache.getMissCountNotFound();
- System.out.println('得到緩存讀取的丟失次數:'+hits3);
- int hits4 = cache.getMissCountExpired();
- System.out.println('得到緩存讀取的已經被銷毀的對象丟失次數:'+hits4);
- }