Ehcache学习笔记(一)基础入门
魯春利的工作筆記,誰說程序員不能有文藝范?
Ehcache是基于Java的開源cache,它提供了強大的緩存能力,并且易于和其他系統集成。
Ehcache?is?an?open-source,?standards-based?cache?for?boosting?performance,?offloading your?database,?and?simplifying?scalability.?As?a?robust,?proven,?and?full-featured solution,?it?is?today’s?most?widely?used?Java-based?cache.?You?can?use?Ehcache?as?a general-purpose?cache?or?a?second-level?cache?for?Hibernate.?You?can?additionally integrate?it?with?third-party?products?such?as?ColdFusion,?Google?App?Engine,?and Spring.Ehcache分為ehcache2和ehcache3:
????Ehcache2地址為:http://www.ehcache.org
????Ehcache3地址為:https://github.com/ehcache/ehcache3/releases
Ehcache3是ehcache版本演進過程中的里程碑,增加了Off-Heap 存儲和 JSR107 兼容,并且將代碼托管到 Github。
Ehcache2的Maven支持
<dependency><groupId>net.sf.ehcache</groupId><artifactId>ehcache</artifactId><version>2.10.0</version> </dependency>Ehcache3的Maven支持
<dependency><groupId>org.ehcache</groupId><artifactId>ehcache</artifactId><version>3.0.0.m4</version> </dependency>Ehcache支持聲明式的配置和編程式的配置。
Ehcache的默認配置文件為:ehcache.xml(http://www.ehcache.org/ehcache.xml)
Ehcache的默認配置文件為ehcache-failsafe.xml(位于ehcache-2.10.0.jar包中),但在應用中一般會創建并使用ehcache.xml,在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="true"?monitoring="autodetect"dynamicConfig="true"><!--?指定磁盤存儲的路徑,會在該目錄先創建.data和.index分別存儲數據與索引?。可能的取值有:*?user.home?-?User's?home?directory*?user.dir?-?User's?current?working?directory*?java.io.tmpdir?-?Default?temp?file?path*?ehcache.disk.store.dir?-?A?system?property?you?would?normally?specify?on?the?command?linee.g.?java?-Dehcache.disk.store.dir=/u01/myapp/diskdir?...Subdirectories?can?be?specified?below?the?property?e.g.?java.io.tmpdir/one--><diskStore?path="java.io.tmpdir"/><!--?Mandatory?Default?Cache?configuration.--><defaultCachemaxEntriesLocalHeap="10000"eternal="false"timeToIdleSeconds="120"timeToLiveSeconds="120"diskSpoolBufferSizeMB="30"maxEntriesLocalDisk="10000000"diskExpiryThreadIntervalSeconds="120"memoryStoreEvictionPolicy="LRU"><persistence?strategy="localTempSwap"/></defaultCache><!--?With?the?"localTempSwap"?strategy,?you?can?use?maxEntriesLocalDisk?ormaxBytesLocalDisk?at?either?the?Cache?or?CacheManager?level?to?control?thesize?of?the?disk?tier.When?the?persistence?strategy?is?"none",?all?cache?stays?in?memory?(withno?overflow?to?disk?nor?persistence?on?disk).--><!--?自定義cache。name:自定義名稱,?必須唯一。maxEntriesLocalHeap:Sets?the?maximum?number?of?objects?that?will?be?created?in?memory.??0?=?no?limit.maxBytesLocalHeap:Defines?how?many?bytes?the?cache?may?use?from?the?VM's?heap,<number>k|K|m|M|g|G。eternal:Sets?whether?elements?are?eternal.?If?eternal,??timeouts?are?ignored?and?the?element?is?never?expired.overflowToDisk:如果內存中數據超過內存限制,是否要緩存到磁盤上。?diskPersistent:?是否在磁盤上持久化。指重啟jvm后,數據是否有效。默認為false。?timeToIdleSeconds:?對象空閑時間,指對象在多長時間沒有被訪問就會失效。只對eternal為false的有效。默認值0,表示一直可以訪問。timeToLiveSeconds:?對象存活時間,指對象從創建到失效所需要的時間。只對eternal為false的有效。默認值0,表示一直可以訪問。????diskExpiryThreadIntervalSeconds:?對象檢測線程運行時間間隔。標識對象狀態的線程多長時間運行一次。diskSpoolBufferSizeMB:?DiskStore使用的磁盤大小,默認值30MB。每個cache使用各自的DiskStore。memoryStoreEvictionPolicy:?如果內存中數據超過內存限制,向磁盤緩存時的策略。默認值LRU,可選FIFO、LFU。?說明:overflowToDisk和diskPersistent、DiskStoreBootstrapCacheLoaderFactory是在2.5及之前版本擁有的參數;2.6及之后的版本建議使用<persistence>或<terracotta>來代替,參閱ehcache.xsd。<persistence?strategy="localTempSwap"/>或<persistence?strategy="none"/>--><cache?name="invicmeCache"maxEntriesLocalHeap="500"eternal="false"overflowToDisk="true"diskPersistent="true"timeToIdleSeconds="300"timeToLiveSeconds="600"diskExpiryThreadIntervalSeconds="1"memoryStoreEvictionPolicy="LFU"></cache> </ehcache>所有ehcache的使用, 都是從 CacheManager開始的,有多種方法創建CacheManager實例:
說明:
????添加了緩存,當數據有改動的時候,需要清除緩存,如有對數據做增加和修改的時候需要清除相關聯的緩存。
????CacheManager 在使用之后應該關閉,雖然有自己的 shutdown hook ,建議在程序中手動關閉。
????CacheManager.getInstance().shutdown();
1、無參
????說明:Ehcache在啟動的時候會掃描classes目錄下的ehcache.xml配置文件,創建CacheManager對象,如果將ehcache.xml文件放到classes目錄下,可以通過無參形式加載配置文件。
2、指定配置文件
CacheManager?cm?=?new?CacheManager("E:\\workspaces\\invicme\\src\\main\\resources\\spring\\ehcache.xml");????說明:如果沒有將配置文件放在classes目錄下,則在ehcache啟動的時候找不到配置文件,沒有創建CacheManager對象,所以在加載配置文件的時候需要通過路徑來加載配置文件;
3、通過資源
URL?url?=?getClass().getResource("/ehcache.xml"); CacheManager?manager?=?new?CacheManager(url);4、通過輸入流
InputStream?is?=?InvicmeCacheUtil.class.getClassLoader().getResourceAsStream("spring/ehcache.xml"); //?logger.info("url?is?"?+?is); cacheManager?=?new?CacheManager(is);代碼示例
package?com.invicme.apps.phshing.util;import?java.io.InputStream; import?java.util.Calendar;import?net.sf.ehcache.Cache; import?net.sf.ehcache.CacheManager; import?net.sf.ehcache.Element;public?class?InvicmeCacheUtil?{private?static?final?int?ONE?=?1;private?static?final?String?DEFAULT_VALUE?=?"0001";private?static?final?int?LENGTH?=?4;//?private?static?final?Logger?logger?=?Logger.getLogger(InvicmeCacheUtil?.class);static?CacheManager?cacheManager?=?null;private?static?void?init?()?{if?(null?==?cacheManager)?{InputStream?is?=?InvicmeCacheUtil.class.getClassLoader().getResourceAsStream("spring/ehcache.xml");//?logger.info("url?is?"?+?is);cacheManager?=?new?CacheManager(is);}}public?synchronized?static?String?generateCode?()?{init?();Cache?cache?=?null;????????if?(null?==?cache)?{cache?=?cacheManager.getCache("invicmeCache");}Calendar?calendar?=?Calendar.getInstance();String?year?=?String.valueOf(calendar.get(Calendar.YEAR));Element?element?=?cache.get(year);if?(null?==?element)?{element?=?new?Element(year,?ONE);cache.put(element);return?year?+?DEFAULT_VALUE;}int?currentValue?=?Integer.valueOf(String.valueOf(element.getObjectValue()));String?str?=?String.valueOf(currentValue?+?1);while?(str.length()?<?LENGTH)?{str?=?"0"?+?str;}cache.remove(year);????//?清除element?=?new?Element(year,?currentValue?+?1);cache.put(element);cache.flush();shutdown();return?year?+?str;}private?static?void?shutdown()?{?if?(null?!=?cacheManager)?{cacheManager.shutdown();?cacheManager?=?null;}}?? }單元測試
public?class?TestInvicmeCacheUtil?extends?Thread?{private?static?final?Logger?logger?=?Logger.getLogger(TestInvicmeCacheUtil.class);public?void?run?()?{for?(int?i?=?0;?i?<?10;?i++)?{try?{Thread.sleep(3);}?catch?(InterruptedException?e)?{e.printStackTrace();}logger.info(Thread.currentThread().getName()?+?":"?+?InvicmeCacheUtil.generateCode());}}public?static?void?main(String[]?args)?{TestInvicmeCacheUtil?util0?=?new?TestInvicmeCacheUtil();util0.setName("util0");TestInvicmeCacheUtil?util1?=?new?TestInvicmeCacheUtil();util1.setName("util1");TestInvicmeCacheUtil?util2?=?new?TestInvicmeCacheUtil();util2.setName("util2");TestInvicmeCacheUtil?util3?=?new?TestInvicmeCacheUtil();util3.setName("util3");util0.start();util1.start();util2.start();util3.start();} }轉載于:https://blog.51cto.com/luchunli/1726800
總結
以上是生活随笔為你收集整理的Ehcache学习笔记(一)基础入门的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2015年的我
- 下一篇: 前言 致Java开发学习前的一段话