1. 程式人生 > >Ehcache入門經典:第二篇ehcache.xml的參數

Ehcache入門經典:第二篇ehcache.xml的參數

new evict 正在 關閉 讀數 memory intervals 忽略 mes

繼續第一篇

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();

Ehcache入門經典:第二篇ehcache.xml的參數