Ehcache(04)——設置緩存的大小

設置緩存的大小

 

目錄

1     CacheManager級別

2     Cache級別

3     大小衡量

4     配置大小示例

 

       緩存大小的限制可以設置在CacheManager上,也可以設置在單個的Cache上。我們可以設置緩存使用內存的大小,也可以設置緩存使用磁盤的大小,但是使用堆內存的大小是必須設置的,其它可設可不設,默認不設就是無限制。在設置緩存大小的時候,我們可以設置緩存使用某一個存儲器的最大字節數,也可以設置緩存在某一個存儲器上最多存放元素的數量。

 

1       CacheManager級別

       CacheManager級別有三個屬性可以分別用來限制三種存儲器緩存信息的大小,其控制的都是字節數,分別是maxBytesLocalHeapmaxBytesLocalOffHeapmaxBytesLocalDiskCacheManager級別限制的大小是其內所有的Cache共享的。

       maxBytesLocalHeap是用來限制緩存所能使用的堆內存的最大字節數的,其單位可以是KMG,不區分大小寫。默認是0,表示不限制。但是當我們沒有指定CacheManager級別的maxBytesLocalHeap時,我們必須在每一個Cache上指定maxBytesLocalHeapmaxEntriesLocalHeap

       maxBytesLocalOffHeap是用來限制緩存所能使用的非堆內存的最大字節數,其單位也可以是KMG。默認是0,表示不限制。但是當我們在CacheManager級別指定了maxBytesLocalOffHeap時就會隱式的使所有Cache級別的overflowToOffHeaptrue,在Cache級別使用該屬性時只會使當前CacheoverflowToOffHeaptrue如果此時不需要overflowToOffHeap的話,那麼我們需要在Cache級別顯示的指定overflowToOffHeapfalse。只有企業版的Ehcache才能使用非堆內存存儲緩存信息。

       maxBytesLocalDisk是用來限制緩存所能使用的磁盤的最大字節數的,其單位可以是KMG。默認是0,表示不限制。只有在單機環境下纔可以使用本地磁盤,分佈式環境下是不可以使用的。另外,這個設置只適用於臨時將緩存內的信息寫入到磁盤的情況,對於持久化緩存信息到磁盤的情況是不適用的。Cache級別的maxBytesLocalDisk同樣如此。當我們在CacheManager級別指定了maxBytesLocalDisk時會隱式的指定所有CacheoverflowToDisktrue,而Cache級別只會使當前CacheoverflowToDisktrue

       下面是一個在CacheManager級別指定緩存大小限制的示例,在該示例中我們指定了該CacheManager所能使用的最大堆內存是500M,最大非堆內存是2G,使用本地磁盤的最大字節數是50G

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
   maxBytesLocalHeap="500M" maxBytesLocalOffHeap="2G" maxBytesLocalDisk="50G">
 
</ehcache>

 

 

2       Cache級別

       CacheManager上能夠指定的限制大小的參數在Cache級別都能使用。當我們在Cache級別指定了某種類型的限制大小後,該Cache將不再共享CacheManager內的該種限制了。如我們在CacheManager級別限制了堆內存的最大使用數maxBytesLocalHeap1G,意味着CacheManager內的所有的Cache將共享這1G的堆內存,如果這個時候我們指定CacheManager內的cache1的最大使用堆內存數maxBytesLocalHeap200M,那就意味着cache1的堆內存最大使用數只能是其自身設置的200M了,而其它Cache只能共享剩餘的824M了。

       CacheManager不同的是我們Cache級別上指定maxBytesLocalHeapmaxBytesLocalOffHeapmaxBytesLocalDisk時還可以使用百分比的形式,前提是對應的限制在CacheManager上有指定。打個比方,我們的CacheManager有如下配置,我們指定了其最多使用的堆內存是500M,那麼這個時候我們在其中定義了一個Cache,在指定其maxBytesLocalHeap時我們可以指定其值爲百分比形式,如50%,表示我們的Cache最多使用CacheManager級別的maxBytesLocalHeap50%,即250M。而如果我們試圖在該Cache上使用百分比的時候指定maxBytesLocalDisk時則會出錯,因爲我們沒有在CacheManager級別上指定maxBytesLocalDiskEhcache也就無法知道你這個百分比到底是多少了。需要注意的是我們所有Cache上指定的字節數大小之和不能超過CacheManager上對應的限制大小;所有Cache上對應限制以百分比形式指定的和不能超過100%

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
   maxBytesLocalHeap="500M">
 
</ehcache>

 

      

       此外,在Cache級別我們還可以利用兩個屬性來限制在堆內存或者是磁盤上緩存元素的最大數,這兩個屬性是maxEntriesLocalHeapmaxEntriesLocalDisk,而對於非堆內存OffHeap的話是不能指定元素的最大數量的。

       maxEntriesLocalHeap是用來限制當前緩存在堆內存上所能保存的最大元素數量的。Ehcache規定如果在CacheManager上沒有指定maxBytesLocalHeap時必須在各個Cache上指定maxBytesLocalHeap或者maxEntriesLocalHeap,但maxEntriesLocalHeapmaxBytesLocalHeap不能同時出現。也就是說我們不能在一個Cache上同時指定maxBytesLocalHeapmaxEntriesLocalHeap,當然我們也不能在Cache上指定maxEntriesLocalHeap的同時在CacheManager上指定maxBytesLocalHeap。但同時在CacheManagerCache上指定maxBytesLocalHeap則是允許的。

       maxEntriesLocalDisk是用來限制在磁盤上所能保存的元素的最大數量的。(暫時覺得這種保存的數量限制應該是對應於持久化的保存)。

 

3       大小衡量

       放在Cache裏面的元素將會使用net.sf.ehcache.pool.sizeof.SizeOf來衡量其大小,當然這種衡量只是針對於存在堆內存裏面的元素而言的,因爲非堆內存和磁盤上我們是直接存的字節,可以直接來計算字節。元素的大小包括元素的keyvalue,以及其它屬性信息,而且在計算大小時這些信息都是遞歸計算的,即如果value關聯了另外一個對象B,那麼B的大小也會被計算在內。如果我們不想計算元素內部某部分內容的大小的話,我們可以通過使用net.sf.ehcache.pool.sizeof.annotations.IgnoreSizeOf註解來標記忽略該內容的大小。IgnoreSizeOf是不會考慮繼承性的,也就是說如果你將IgnoreSizeOf標註在類型A上,那麼將只會忽略A的大小,而不會忽略A的子類B的大小,如果也需要忽略B的大小的話,則需要在類B上也使用IgnoreSizeOf進行標註。

       IgnoreSizeOf可以標記在三個地方。

       1屬性上:表示忽略某對象的對應屬性。如下表示我們將忽略User對象的role屬性。

public class User {
 
   @IgnoreSizeOf
   private Role role;
  
}

 

 

       2類上:表示將忽略該中類型。如下表示我們將忽略User類型。

@IgnoreSizeOf
public class User {
 
   private String name;
  
}

 

 

       3包上:標記在包上的時候是標記在包對應的package-info.java上,表示將忽略該包下面所有的類型,如我們要忽略com.xxx.xxx包下的所有內容時可以在該包對應的package-info.java文件中的package上使用IgnoreSizeOf註解進行標註。

@net.sf.ehcache.pool.sizeof.annotations.IgnoreSizeOf
package com.xxx.xxx;

 

 

       此外,我們也可以通過全限定名的方式指定在計算Cache中元素的大小時哪些屬性、類和包需要忽略,然後把這些信息寫在一個屬性文件裏面,再將系統屬性net.sf.ehcache.sizeof.filter指向該文件。系統屬性可以通過java –Dnet.sf.ehcache.sizeof.filter來指定。



 

 

       如上所述,我們的SizeOf在進行大小衡量的時候是進行遞歸衡量的,即會計算對象所持有的引用、引用的引用等。針對於此,我們可以來指定SizeOf在進行大小衡量時的一個策略,sizeOfPolicysizeOfPolicyCacheManager級別的和Cache級別的,分別對應於ehcache子元素和cache子元素或defaultCache子元素。當Cache級別和CacheManager級別同時指定有sizeOfPolicy時,Cache級別的配置將覆蓋CacheManager級別的配置。sizeOfPolicy元素有兩個屬性,maxDepthmaxDepthExceededBehavior

l  maxDepth表示鏈接的最大深度。

l  maxDepthExceededBehavior表示當訪問的深度超過指定的maxDepth後的行爲,對應有continueabort兩種。continue將給出一個警告,然後繼續計算大小,這是默認值;abort將給出警告,然後中止此次計算,並標記沒有跟蹤到內存的使用。

 

4       配置大小示例

 

1)只在CacheManager級別指定大小限制,沒有在Cache級別指定,這種情況下cache1cache2cache3將平分CacheManager級別的大小限制,即各自擁有CacheManager級別的heapoffHeapdisk三分之一的容量。

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
   maxBytesLocalHeap="500M" maxBytesLocalOffHeap="5G" maxBytesLocalDisk="50G">
  
   <cache name="cache1"/>
   <cache name="cache2"/>
   <cache name="cache3"/>
 
</ehcache>

 

 

2CacheManager級別指定了大小限制,同時某些Cache也指定了大小限制。如下,我們指定了cache1maxBytesLocalHeap200M,這個時候cache1將可以使用到200M的堆內存,而cache2cache3將平分CacheManager級別除去cache1所擁有的200M之外的堆內存,即各150M。而CacheManager級別的offHeapdisk容量將由cache1cache2cache3平分,各得三分之一。

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
   maxBytesLocalHeap="500M" maxBytesLocalOffHeap="5G" maxBytesLocalDisk="50G">
  
   <cache name="cache1" maxBytesLocalHeap="200M"/>
   <cache name="cache2"/>
   <cache name="cache3"/>
 
</ehcache>

 

 

3CacheManager不指定大小限制,Cache級別指定大小限制。這個時候將各用各的,即各個Cache只能使用其自身指定好的大小。

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd">
  
   <cache name="cache1" maxBytesLocalHeap="200M"/>
   <cache name="cache2" maxBytesLocalHeap="300M"/>
   <cache name="cache3" maxBytesLocalHeap="200M"/>
 
</ehcache>

 

 

4)當我們在CacheManager級別指定了大小限制之後,我們可以在Cache級別通過百分比的形式來指定其可使用的對應大小限制。在下面示例中,我們的CacheManager擁有500Mheap內存,5GoffHeap內存,50Gdisk容量。cache1擁有CacheManager 20%heap內存,即100M,剩餘的400M cache2cache3平分,即各200Mcache2擁有CacheManager 20%offHeap內存,即1G,剩餘的4G將由cache1cache3平分,即各2Gcache3擁有CacheManager 20%disk容量,即10G,剩餘的40G將由cache1cache2平分,即各20G。所以最終cache1將擁有heap 100MoffHeap 2Gdisk 20Gcache2將擁有heap 200MoffHeap 1Gdisk 20Gcache3將擁有heap 200MoffHeap 2Gdisk 10G

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
   maxBytesLocalHeap="500M" maxBytesLocalOffHeap="5G" maxBytesLocalDisk="50G">
  
   <cache name="cache1" maxBytesLocalHeap="20%"/>
   <cache name="cache2" maxBytesLocalOffHeap="20%"/>
   <cache name="cache3" maxBytesLocalDisk="20%"/>
 
</ehcache>

 

 

5)當我們沒有在CacheManager上指定某種資源的可用量時我們還可以在Cache級別進行指定。CacheManager只有600Mheap內存,cache1cache2cache3都沒有顯式的指定使用多少heap內存,所以將各得200M heap內存。而cache1還指定了可以使用2GoffHeap內存;cache2還指定了可以使用20G的磁盤;而cache3僅僅只能使用CacheManager分配下來的200M heap內存。

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
   maxBytesLocalHeap="600M">
  
   <cache name="cache1" maxBytesLocalOffHeap="2G"/>
   <cache name="cache2" maxBytesLocalDisk="20G"/>
   <cache name="cache3"/>
 
</ehcache>

 

 

       總之,當Cache自身設置了某種容量的限制時,在對應類型的容量限制上將使用自身的限制,如某Cache自身設置了maxBytesLocalHeap100M,那麼它能夠使用的堆內存的最大量就是100M。而當Cache自身沒有指定某種類型的容量限制時,如果在CacheManager級別有指定的話,那麼該Cache將和其它同樣沒有指定該類型容量限制的Cache一起平分CacheManager級別該種類型的容量被指定了該類型容量限制的Cache瓜分後剩餘的容量,否則其將沒有該種類型的容量可用。如當CacheA沒有指定maxBytesLocalDisk限制,而在CacheManager級別指定了maxBytesLocalDisk限制爲10G,如果在該CacheManager內還有另外一個CacheB指定了maxBytesLocalDisk限制爲5G,那麼CacheA將能夠使用的disk容量爲5G,如果此時還有另外NCache也沒有指定maxBytesLocalDisk限制的話,那麼它們將和CacheA一起瓜分CacheManagerdisk容量10G除去CacheBdisk容量5G後剩餘的5G,即各5/(N+1)G。如果CacheManager級別也沒有指定maxBytesLocalDisk的話,那麼CacheA和其它同樣沒有指定maxBytesLocalDiskCache將不能使用disk進行Cache信息的存儲(這裏是假設這些Cache同樣都沒有指定maxEntriesLocalDisk)。關於這塊如果還有不懂的,可以參考第四小節“配置大小示例”中示例。

 

(本文是基於Ehcache2.8.1所寫)

  • a46f5b7d-4c05-356d-906e-9e2130bc1d53-thumb.png
  • 大小: 6.6 KB
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章