ehcache緩存入門學習
1,概念 特性
EhCache 是一個純Java的進程內緩存框架,具有快速、精干等特點,是Hibernate中默認的CacheProvider。
主要的特性有:1. 快速2. 簡單3. 多種緩存策略4. 緩存數據有兩級:內存和磁盤,因此無需擔心容量問題5. 緩存數據會在
虛擬機重的過程中寫入磁盤6. 可以通過RMI、可插入API等方式進行分布式緩存7. 具有緩存和緩存管理器的偵聽接口8. 支持多
緩存管理器實例,以一個實例的多個緩存區域9. 提供Hibernate的緩存實現
2,屬於哪種類型 的緩存
ehcache緩存屬於之前提到過的那種 LocalCache類型,緩存和應用是在一個jvm中的,正常情況下和其他jvm或者其他系統沒有通信的,不能共用。是完全獨立在使用它的那個jvm中的。
3大概的使用方法,
使用的大概就是,在一個配置文件配置緩存的各種信息,然后java代碼使用的時候,去讀取這個文件,並組成對象,然后就可以獲取到配置的緩存對象,然后使用的時候,將要緩存的內容,key-value形式放入到配置的緩存對象里去。獲取也一樣。
4,配置文件介紹--只是簡單的介紹,具體的配置信息需要的話搜索下
xml文件中可以配置的大體有
1,如果需要寫入硬盤的話,配置一個磁盤路徑
<disStore path=”java.io.tmpdir”/>也可以配置一個物理路徑
2,cachemanager的一個監聽器工廠,監聽器,可以用來監聽緩存對象的增加了什么的,做一下緩存的統計工作。
CacheManagerEventListenerFactory CacheManagerEventListener 寫監聽器的時候 需要繼承實現一下ehcache自己的抽象類
3,cache的配置,配置了緩存的各種存儲信息,更新策略信息等。
· name:Cache的唯一標識
· maxElementsInMemory:內存中最大緩存對象數。
· maxElementsOnDisk:磁盤中最大緩存對象數,若是0表示無窮大。
· eternal:Element是否永久有效,一但設置了,timeout將不起作用。
· overflowToDisk:配置此屬性,當內存中Element數量達到maxElementsInMemory時,Ehcache將會Element寫到磁盤中。
· timeToIdleSeconds:設置Element在失效前的允許閑置時間。僅當element不是永久有效時使用,可選屬性,默認值是0,也就是可閑置時間無窮大。
· timeToLiveSeconds:設置Element在失效前允許存活時間。最大時間介於創建時間和失效時間之間。僅當element不是永久有效時使用,默認是0.,也就是element存活時間無窮大。
· diskPersistent:是否緩存虛擬機重啟期數據。(這個虛擬機是指什么虛擬機一直沒看明白是什么,有高人還希望能指點一二)。
· diskExpiryThreadIntervalSeconds:磁盤失效線程運行時間間隔,默認是120秒。
· diskSpoolBufferSizeMB:這個參數設置DiskStore(磁盤緩存)的緩存區大小。默認是30MB。每個Cache都應該有自己的一個緩沖區。
· memoryStoreEvictionPolicy:當達到maxElementsInMemory限制時,Ehcache將會根據指定的策略去清理內存。默認策略是LRU(最近最少使用)。你可以設置為FIFO(先進先出)或是LFU(較少使用)。這里比較遺憾,Ehcache並沒有提供一個用戶定制策略的接口,僅僅支持三種指定策略,感覺做的不夠理想。
4,cache的監聽器工廠,監聽器,可以用來監聽該緩存對象緩存內容的一些操作。
cacheEventListenerFactory cacheEventListener 寫監聽器的時候 需要繼承實現一下ehcache自己的抽象類
5,還有就是一些集群方面的配置。
cacheManagerPeerProviderFactory cacheManagerPeerListenerFactory
5,java代碼使用
具體方法就是,先用cachemanager通過配置文件,創建一個cachemanager對象,然后從這個對象中可以根據配置的cache的name屬性的值
獲取到具體的緩存對象,然后可以從這個對象中根據key找到緩存的element對象,添加緩存的時候也是 先組裝一個element對象,然后直接將對象put到cache對象中即可。如下是在ServletContextListener項目啟動的時候 加載一些東西到緩存,比如數據字典什么的 。
@Override
public void contextInitialized(ServletContextEvent arg0) {
CacheManager cm = CacheManager.create(arg0.getServletContext().getRealPath("\\WEB-INF\\classes\\ehcache.xml"));
Cache ca = cm.getCache("mycache");
Element e = new Element("username", "liubanban");
Element e1 = new Element("usertel", "18515154585");
ca.put(e);
ca.put(e1);
arg0.getServletContext().setAttribute("mycache", ca);
}
6,集群問題
因為ehcache緩存是和jvm共享的,那么就會有這樣的一個問題,就是當項目通過集群結構來部署的時候,每次請求都有可能分發到不同的jvm中,那么整體系統的緩存內容數據就不一致了。失去了緩存的意義,這里ehcache也有解決方案。可以在xml文件通過配置,然后實現緩存內容同步。具體配置信息自行百度下了。大致上就是通過監聽或者廣播的方法,先獲知其他節點緩存有更新,然后再講最新的數據分發到所有節點進行更新,以保證集群所有節點緩存數據一致。
ehcache的東西還有很多。