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

来源:https://www.cnblogs.com/tk55/archive/2018/04/04/8712159.html
-Advertisement-
Play Games

繼續第一篇 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();

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Axure RP就是用來給網站畫圖紙的軟體。它如同服裝設計師的樣衣,如同建築師的圖紙,如同電影導演的故事板,如同售樓處的樣板間。總之,它能讓你在真正付出時間和金錢來製作一個網站之前,能夠完全瞭解到最終真正網站所具有的功能,設計,交互和用戶體驗。就親眼看到,親手用到一個網站。然後在這個原型的基礎上進行 ...
  • js中有六大數據類型,包括五種基本數據類型number、boolean、null、undefiined、string和混合數據類型object 我們可以用typeof操作符來檢測變數的數據類型(輸出的是一個關於數據類型的字元串) 以上代碼中,null進行typeof操作符後,結果是object,是因 ...
  • 《21天網站建設實錄》以網頁設計師的項目開發為背景,以“阿裡里線上購物”商業網站的開發過程為流程,通過21天的任務期限,以一天一項任務、一天掌握一項技能項目實戰的學習模式,全面講解了一個網站立項、策劃、製作、完善、優化、上傳及維護等環節的完整過程,詳細敘述了商業網站開發的一般性知識和網站建設所涉及的 ...
  • 很多從事Web前端開發的人對HTML總有些不滿,比如需要手動檢查和設計很多格式代碼,不僅容易出錯,而且存在大量重覆。好在HTML5讓我們看到了曙光。作為下一代Web開發標準,HTML5成為主流的日子已經不遠。它對音頻視頻、表單驗證、事件處理、繪圖等的支持都讓我們非常期待,視頻音頻的播放、表單檢查和提 ...
  • 一、綁定class的幾種方式 1.對象語法 直接看例子: 2.數組語法 直接看例子: 使用計算屬性給元素動態設置類名,在業務中經常用到,尤其是在寫復用的組件時,所以在開發過程中,如果表達式較長或邏輯複雜,應該儘可能地優先使用計算屬性。 3.在組件上使用 直接看例子: 這種用法僅適用於自定義組件的最外 ...
  • 由於網上很多都是用很多演算法和邏輯使用canvas進行繪製,但有時也無法解決一些小眾需求。 ...
  • 前言 距離上次我寫 React 入門教程已經快2個月了,年頭年尾總是比較忙哈,在 " React 入門教程(一)" 我大概介紹了 React 的使用和一些註意事項,這次讓我們來繼續學習 React 一、 React 解決了什麼? 前端有很多框架和庫,但是他們很多都是解決類似的問題,而我們去學習一個框 ...
  • 一、三次面向對象 多項式計算: 第一次作業雖然只是練習簡單的字元串的匹配,但我需要從頭開始學習Java和麵向對象的思想。第一次面向對象寫代碼就會發現,難免又回到面向過程的思想上。我是先寫完Java再寫的C程式,雖然之後的C程式沒有用正則表達式,稍微有些冗長,卻感覺寫起來順手多了。這樣的不習慣反而讓我 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...