天天看點

Ehcache(01)——簡介、基本操作 1       CacheManager 2       Cache

Ehcache簡介

目錄

1       CacheManager

1.1      構造方法建構

1.2      靜态方法建構

2       Cache

2.1      Cache的建立

       Ehcache是用來管理緩存的一個工具,其緩存的資料可以是存放在記憶體裡面的,也可以是存放在硬碟上的。其核心是CacheManager,一切Ehcache的應用都是從CacheManager開始的。它是用來管理Cache(緩存)的,一個應用可以有多個CacheManager,而一個CacheManager下又可以有多個Cache。Cache内部儲存的是一個個的Element,而一個Element中儲存的是一個key和value的配對,相當于Map裡面的一個Entry。

       CacheManager是Ehcache的核心,它的主要職責是對Cache的建立、移除和通路。隻有CacheManager裡面的Cache才能實作緩存資料的功能。一切使用Ehcache的應用都是從建構CacheManager開始的。建構CacheManager時,我們可以直接通過其構造方法來進行建構,也可以通過使用CacheManager提供的靜态方法來進行建構。

       使用構造方法建構CacheManager時每次都會産生一個新的CacheManager對象,并且會以該CacheManager對應的name作為key儲存該CacheManager。當我們在建構CacheManager時如果已經存在name相同正在使用的CacheManager,則會抛出異常。此外,當多個CacheManager對應的storePath相同時,則它們存放在磁盤上包含緩存資訊的檔案将會互相覆寫。

1.使用預設配置

       當我們使用CacheManager的無參構造方法來構造CacheManager時就是使用的預設配置。這種情況最終還是會尋找預設的配置檔案進行配置。Ehcache首先會到類根路徑下尋找一個叫ehcache.xml的配置檔案來配置CacheManager,如果沒有找到該檔案,則會加載CacheManager的預設配置ehcache-failsafe.xml檔案,這個檔案是在ehcache.jar裡面的。關于配置檔案如何配置的問題将在後續的文章中再做一個詳細的講解,這裡先來簡單看一個配置檔案。

       每一個配置檔案的根元素都是ehcache,在該元素上可以指定一些CacheManager級别的參數。ehcache元素下的每一個cache元素代表一個緩存定義。cache元素上可以指定一些Cache級别的屬性。下面是一個使用預設配置建構CacheManager的示例。

2.以Configuration作為參數

       Configuration是用來指定CacheManager配置資訊的,其它通過不同的方式所指定的構造參數最終都會轉化為一個對應的Configuration對象,然後再利用該Configuration對象初始化CacheManager。

3.以xml格式的配置對應的InputStream作為參數

       通過Xml格式的配置對應的InputStream作為參數時,Ehcache會對Xml進行解析,然後構造一個對應的Configuration對象。

4.以xml格式的配置檔案對應的路徑作為參數

   指定xml格式的配置檔案對應的路徑後,Ehcache會擷取指定路徑對應的配置檔案,然後擷取其輸入流,再利用InputStream的方式構造CacheManager。這裡的路徑可以是相對路徑,也可以是絕對路徑。

5.以xml格式的配置對應的URL作為參數

       以URL作為參數時,實際上ehcache還是通過擷取URL對應的InputStream,然後再利用該InputStream以InputStream構造CacheManager的方式進行CacheManager的構造。

       在CacheManager内部定義了一系列的用于建構CacheManager對象的靜态方法。這主要可以分為兩大類,一類是通過create()方法及其重載方法建構的,一類是通過newInstance()方法及其重載方法建構的。create()方法建構的都是單例,而newInstance()方法建構的可能是單例,也可能是多例。在CacheManager内部持有一個CacheManager類型的singleton對象,每次我們調用create()方法及其重載方法時,Ehcache都會判斷目前的singleton對象是否非空,如果非空則直接傳回,否則則以相應的配置建構一個CacheManager對象賦給singleton并進行傳回。在調用newInstance()方法及其重載方法建構CacheManager時,Ehcache首先會判斷我們之前是否建立過且還存在同樣名稱的CacheManager對象,如果有則直接傳回該CacheManager對象,否則将建立一個CacheManager進行傳回。是以調用CacheManager的newInstance()系列方法建構CacheManager與直接調用CacheManager的構造方法構造CacheManager對象的差別就在于調用newInstance()系列方法時如有同名的存在,會直接傳回先前的,而不會抛出異常。此外CacheManager内部還定義了一個getInstance()靜态方法,調用它時相當于是調用了不帶參數的create()方法。

1.create()方法

       在CacheManager内部一共定義有五個create()方法,分别對應于CacheManager的五個newInstance()方法,而每一個newInstance()方法又對應于CacheManager對應的構造方法。在調用時Ehcache會先判斷CacheManager内部持有的singleton是否為空,非空則直接傳回singleton,否則将傳回對應參數的newInstance()傳回的執行個體對象并指派給singleton。

2.newInstance()方法

       在CacheManager内部一共定義有五個newInstance()方法,分别對應于CacheManager的五個構造方法。在調用newInstance()方法時,Ehcache會檢視CacheManager内部是否儲存有曾經建立的且同名的CacheManager,如果有則傳回該對象,否則建構一個新的CacheManager對象進行傳回。是以newInstance()方法并不一定會産生一個新的對象。

       當我們不再需要使用CacheManager的時候,我們需要将CacheManager進行關閉。Ehcache為我們提供了一個關閉CacheManager的鈎子,預設情況下是不可用的,通過設定系統屬性net.sf.ehcache.enableShutdownHook=true就可以将該功能打開。但是官方還是推薦我們在程式裡面調用CacheManager的shutdown()方法來将目前CacheManager進行關閉。

       在Ehcache中定義了一個對緩存進行處理的接口叫Ehcache,Cache是Ehcache的一個實作類。Cache是由CacheManager進行管理的,使用CacheManager生成的就是一個Cache對象。Cache裡面儲存的是一個個的Element對象,這些對象通常都是儲存在MemoryStore裡面的,但也可以溢出到DiskStore。Element裡面存放的是一個key和value的配對,其中key和value都是Object。Cache的建立可以事先在建立CacheManager的時候定義好,也可以在之後調用CacheManager執行個體的相關方法進行Cache的添加。Cache是線程安全的。

       Cache的建立主要有兩種方式,一種是通過Cache的構造方法建立,另一種是通過CacheManager建立。Cache中定義了一系列的構造方法,這裡我們拿常用的利用CacheConfiguration來構造Cache做個示例。

       注意:通過使用Cache的構造方法直接new出來的Cache一定要添加到CacheManager中才能使用。

       通過CacheManager建立的Cache是指我們把Cache定義在CacheManager對應的配置資訊裡面,這樣在建立CacheManager的時候也會把其中定義的Cache進行執行個體化并添加到對應的CacheManager中。根據建構CacheManager的方式不同,我們把Cache定義在CacheManager的配置資訊中的方式也不同。總的來說有兩種方式,一種是定義的對應的Xml格式的配置資訊中,另一種是通過Configuration建構CacheManager時把CacheConfiguration添加到Configuration中。在之前介紹CacheManager的時候我們已經提到了在Ehcache配置檔案中每一個cache元素代表一個Cache定義。簡單示例如下:

       通過Configuration建構CacheManager時我們隻需要把Cache定義即CacheConfiguration添加到Configuration中即可,示例代碼如下:

       Cache内容的CRUD是指對Cache中儲存的元素進行CRUD操作。

(1)新增元素

       新增元素可以通過Cache的put(Element ele)方法來進行。Element是鍵值對形式,我們真正想要緩存的其實是Element的value,但是我們可以通過key來差別不同的value。同時Element中還包括我們緩存的一些額外資訊,如緩存的時間等。Element的key和value類似于Map的key和value,均可為Object對象。

(2)擷取元素

       擷取元素的時候我們可以通過Cache的get()方法來進行的,其接收的參數是元素的key。

(3)更新元素

       當我們在往Cache裡面put元素的時候,如果Cache中已經存在相同key的元素了,則會用新的元素替換舊的元素,這也就意味着之前元素的一些資訊将會丢失,如被查到的次數hitCount和建立時間等。

       此外,使用Cache的replace(Element ele)方法也可以更新Cache中對應的元素。與直接put更新不同的是,replace隻會在Cache中擁有相同key的元素時才會對之前的元素進行更新。replace也會覆寫之前元素資訊。

(4)删除元素

       删除元素是通過Cache的remove()方法進行的,其接收所要删除元素的key作為參數。

(本文是基于Ehcache2.8.1寫的)

繼續閱讀