繼續第一篇 diskStorepath:指定在硬碟上存儲對象的路徑path屬性可以配置的目錄有: user.home(用戶的家目錄) user.dir(用戶當前的工作目錄) java.io.tmpdir(預設的臨時目錄) ehcache.disk.store.dir(ehcache的配置目錄) 絕對 ...
繼續第一篇
diskStore
path:指定在硬碟上存儲對象的路徑
path屬性可以配置的目錄有:
user.home(用戶的家目錄)
user.dir(用戶當前的工作目錄)
java.io.tmpdir(預設的臨時目錄)
ehcache.disk.store.dir(ehcache的配置目錄)
絕對路徑(如:c:\\ehcache)
<diskStore path="G:\\eclipse\\workspace8\\Ehcache\\src\\com\\ij34\\cache" />
System.out.println("userHome:"+System.getProperty("user.home"));
System.out.println("userDir:"+System.getProperty("user.dir")); System.out.println("tmpDir:"+System.getProperty("java.io.tmpdir"));
一、以下屬性是必須的:
1、name: Cache的名稱,必須是唯一的(ehcache會把這個cache放到HashMap里)。
2、maxElementsInMemory:在記憶體中緩存的element的最大數目。
3、maxElementsOnDisk:在磁碟上緩存的element的最大數目,預設值為0,表示不限制。
4、eternal:設定緩存的elements是否永遠不過期。如果為true,則緩存的數據始終有效,如果為false那麼還要根據timeToIdleSeconds,timeToLiveSeconds判斷。
5、overflowToDisk: 如果記憶體中數據超過記憶體限制,是否要緩存到磁碟上。
二、以下屬性是可選的:
cache元素中可以指定的屬性也有很多,但只有一個是必須的。那就是name屬性。
name:指定cache的名稱。
1、diskPersistent: 是否在磁碟上持久化。指重啟jvm後,數據是否有效。預設為false。
2、memoryStoreEvictionPolicy: 如果記憶體中數據超過記憶體限制,向磁碟緩存時的策略。預設值LRU,可選FIFO、LFU。
3、maxEntriesLocalDisk:指定允許在硬碟上存放元素的最大數量,0表示不限制。這個屬性我們也可以在運行期通過CacheConfiguration來更改。
4、 maxEntriesLocalHeap:指定允許在記憶體中存放元素的最大數量,0表示不限制。這個屬性也可以在運行期動態修改。
5、maxEntriesInCache:指定緩存中允許存放元素的最大數量。這個屬性也可以在運行期動態修改。但是這個屬性只對Terracotta分散式緩存有用。
6、maxBytesLocalDisk:指定當前緩存能夠使用的硬碟的最大位元組數,其值可以是數字加單位,單位可以是K、M或者G,不區分大小寫,如:30G。當在CacheManager級別指定了該屬性後,Cache級別也可以用百分比來表示,如:60%,表示最多使用CacheManager級別指定硬碟容量的60%。該屬性也可以在運行期指定。當指定了該屬性後會隱式的使當前Cache的overflowToDisk為true。
7、maxBytesLocalHeap:指定當前緩存能夠使用的堆記憶體的最大位元組數,其值的設置規則跟maxBytesLocalDisk是一樣的。
8、maxBytesLocalOffHeap:指定當前Cache允許使用的非堆記憶體的最大位元組數。當指定了該屬性後,會使當前Cache的overflowToOffHeap的值變為true,如果我們需要關閉overflowToOffHeap,那麼我們需要顯示的指定overflowToOffHeap的值為false。
9、 overflowToDisk:boolean類型,預設為false。當記憶體裡面的緩存已經達到預設的上限時是否允許將按驅除策略驅除的元素保存在硬碟上,預設是LRU(最近最少使用)。當指定為false的時候表示緩存信息不會保存到磁碟上,只會保存在記憶體中。該屬性現在已經廢棄,推薦使用cache元素的子元素persistence來代替,如:<persistence strategy=”localTempSwap”/>。
10、diskSpoolBufferSizeMB:當往磁碟上寫入緩存信息時緩衝區的大小,單位是MB,預設是30。
11、overflowToOffHeap:boolean類型,預設為false。表示是否允許Cache使用非堆記憶體進行存儲,非堆記憶體是不受Java GC影響的。該屬性只對企業版Ehcache有用。
12、copyOnRead:當指定該屬性為true時,我們在從Cache中讀數據時取到的是Cache中對應元素的一個copy副本,而不是對應的一個引用。預設為false。
13、copyOnWrite:當指定該屬性為true時,我們在往Cache中寫入數據時用的是原對象的一個copy副本,而不是對應的一個引用。預設為false。
14、timeToIdleSeconds:單位是秒,表示一個元素所允許閑置的最大時間,也就是說一個元素在不被請求的情況下允許在緩存中待的最大時間。預設是0,表示不限制。
15、timeToLiveSeconds:單位是秒,表示無論一個元素閑置與否,其允許在Cache中存在的最大時間。預設是0,表示不限制。
16、eternal:boolean類型,表示是否永恆,預設為false。如果設為true,將忽略timeToIdleSeconds和timeToLiveSeconds,Cache內的元素永遠都不會過期,也就不會因為元素的過期而被清除了。
17、diskExpiryThreadIntervalSeconds :單位是秒,表示多久檢查元素是否過期的線程多久運行一次,預設是120秒。
18、clearOnFlush:boolean類型。表示在調用Cache的flush方法時是否要清空MemoryStore。預設為true。
三、子元素
3.1、persistence:表示Cache的持久化,它只有一個屬性strategy,表示當前Cache對應的持久化策略。其可選值如下:
localTempSwap:當堆記憶體或者非堆記憶體裡面的元素已經滿了的時候,將其中的元素臨時的存放在磁碟上,一旦重啟就會消失。
localRestartable:該策略只對企業版Ehcache有用。它可以在重啟的時候將堆記憶體或者非堆記憶體裡面的元素持久化到硬碟上,重啟之後再從硬碟上恢復元素到記憶體中。
none:不持久化緩存的元素
distributed:該策略不適用於單機,是用於分散式的。
3.2、copyStrategy:當我們指定了copyOnRead或copyOnWrite為true時,就會用到我們的copyStrategy,即拷貝策略了。預設的copyStrategy是通過序列化來實現的,我們可以通過實現net.sf.ehcache.store.compound.CopyStrategy介面來實現自己的CopyStrategy,然後只需在cache元素下定義一個copyStrategy元素並指定其class屬性為我們的CopyStrategy實現類。如:<copyStrategy class="xxx.xxx.xxx"/>。
3.3、pinning:表示將緩存內的元素固定住,除非過期,否則不會對它進行刪除和驅除到其它儲存容器中。pinning元素只定義了一個屬性store,表示將把元素固定在哪個位置。其可選值有localMemory和inCache。
localMemory:表示將元素固定在記憶體中。
inCache:表示將元素固定在任何其正在保存的容器中。
四、緩存的3 種清空策略 :
1、FIFO ,first in first out (先進先出).
2、LFU , Less Frequently Used (最少使用).意思是一直以來最少被使用的。緩存的元素有一個hit 屬性,hit 值最小的將會被清出緩存。
3、LRU ,Least Recently Used(最近最少使用). (ehcache 預設值).緩存的元素有一個時間戳,當緩存容量滿了,而又需要騰出地方來緩存新的元素的時候,那麼現有緩存元素中時間戳離當前時間最遠的元素將被清出緩存。
五、defaultCache
defaultCache:
預設的緩存配置信息,如果不加特殊說明,則所有對象按照此配置項處理
maxElementsInMemory:設置了緩存的上限,最多存儲多少個記錄對象
eternal:代表對象是否永不過期
timeToIdleSeconds:最大的發呆時間
timeToLiveSeconds:最大的存活時間
overflowToDisk:是否允許對象被寫入到磁碟
六、方法
創建CacheManager 的方法:
方法一:
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();
}
獲取cacheNames 列表:
方法一:
CacheManager.create();
String[] cacheNames = CacheManager.getInstance().getCacheNames();
方法二:
CacheManager manager = new CacheManager();
String[] cacheNames = manager.getCacheNames();
方法三:
CacheManager manager1 = new CacheManager("src/config/ehcache1.xml");
CacheManager manager2 = new CacheManager("src/config/ehcache2.xml");
String[] cacheNamesForManager1 = manager1.getCacheNames();
String[] cacheNamesForManager2 = manager2.getCacheNames();
添加和刪除緩存元素:
設置一個名為testCache 的新cache,屬性為預設:
CacheManager singletonManager = CacheManager.create();
singletonManager.addCache("testCache");
Cache test = singletonManager.getCache("testCache");
設置一個名為testCache 的新cache,並定義其屬性:
CacheManager singletonManager = CacheManager.create();
Cache memoryOnlyCache = new Cache("testCache", 5000, false, false, 5, 2);
singletonManager.addCache(memoryOnlyCache);
Cache test = singletonManager.getCache("testCache");
Cache 屬性說明:
構造函數:
public Cache(String name,
int maxElementsInMemory,
boolean overflowToDisk,
boolean eternal,
long timeToLiveSeconds,
long timeToIdleSeconds)
參數說明:
name :元素名字。
maxElementsInMemory :設定記憶體中創建對象的最大值。
overflowToDisk : 設置當記憶體中緩存達到 maxInMemory 限制時元素是否可寫到磁碟上。
eternal : 設置元素是否永久駐留。
timeToIdleSeconds : 設置某個元素消亡前的停頓時間。也就是在一個元素消亡之前,兩次訪問時間的最大時間間隔值。只能在元素不是永久駐留時有效。
timeToLiveSeconds : 設置某個元素消亡前的生存時間。也就是一個元素從構建到消亡的最大時間間隔值。只能在元素不是永久駐留時有效。
刪除緩存元素:
CacheManager singletonManager = CacheManager.create();
singletonManager.removeCache("testCache");
關閉緩存管理器 CacheManager
CacheManager.getInstance().shutdown();
對於緩存對象的操作:
放入一個簡單的對象到緩存元素;
Cache cache = manager.getCache("testCache");
Element element = new Element("key1", "value1");
cache.put(element);
得到一個序列化後的對象屬性值;
Cache cache = manager.getCache("testCache");
Element element = cache.get("key1");
Serializable value = element.getValue();
得到一個沒有序列化後的對象屬性值;
Cache cache = manager.getCache("testCache");
Element element = cache.get("key1");
Object value = element.getObjectValue();
刪除一個對象從元素;
Cache cache = manager.getCache("testCache");
Element element = new Element("key1", "value1");
cache.remove("key1");
對於永固性磁碟存儲,立即存儲到磁碟:
Cache cache = manager.getCache("testCache");
cache.flush();
獲得緩存大小:
得到緩存的對象數量;
Cache cache = manager.getCache("testCache");
int elementsInMemory = cache.getSize();
得到緩存對象占用記憶體的數量
Cache cache = manager.getCache("testCache");
long elementsInMemory = cache.getMemoryStoreSize();
得到緩存對對象占用磁碟的數量
Cache cache = manager.getCache("testCache");
long elementsInMemory = cache.getDiskStoreSize();
關於緩存的讀取和丟失的記錄:
得到緩存讀取的命中次數;
Cache cache = manager.getCache("testCache");
int hits = cache.getHitCount();
得到記憶體中緩存讀取的命中次數;
Cache cache = manager.getCache("testCache");
int hits = cache.getMemoryStoreHitCount();
得到磁碟中緩存讀取的命中次數;
Cache cache = manager.getCache("testCache");
int hits = cache.getDiskStoreCount();
得到緩存讀取的丟失次數;
Cache cache = manager.getCache("testCache");
int hits = cache.getMissCountNotFound();
得到緩存讀取的已經被銷毀的對象丟失次數;
Cache cache = manager.getCache("testCache");
int hits = cache.getMissCountExpired();