日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

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

系統 2061 0

設置緩存的大小

?

目錄

1???? CacheManager 級別

2???? Cache 級別

3???? 大小衡量

4???? 配置大小示例

?

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

?

1 ?????? CacheManager 級別

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

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

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

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

?????? 下面是一個在 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 級別限制了堆內存的最大使用數 maxBytesLocalHeap 1G ,意味著 CacheManager 內的所有的 Cache 將共享這 1G 的堆內存,如果這個時候我們指定 CacheManager 內的 cache1 的最大使用堆內存數 maxBytesLocalHeap 200M ,那就意味著 cache1 的堆內存最大使用數只能是其自身設置的 200M 了,而其它 Cache 只能共享剩余的 824M 了。

?????? CacheManager 不同的是我們 Cache 級別上 指定 maxBytesLocalHeap maxBytesLocalOffHeap maxBytesLocalDisk 時還可以 使用百分比 的形式, 前提是對應的限制在 CacheManager 上有指定 。打個比方,我們的 CacheManager 有如下配置,我們指定了其最多使用的堆內存是 500M ,那么這個時候我們在其中定義了一個 Cache ,在指定其 maxBytesLocalHeap 時我們可以指定其值為百分比形式,如 50% ,表示我們的 Cache 最多使用 CacheManager 級別的 maxBytesLocalHeap 50% ,即 250M 。而如果我們試圖在該 Cache 上使用百分比的時候指定 maxBytesLocalDisk 時則會出錯,因為我們沒有在 CacheManager 級別上指定 maxBytesLocalDisk Ehcache 也就無法知道你這個百分比到底是多少了。需要注意的是 我們所有 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 級別我們還可以利用兩個屬性來限制在堆內存或者是磁盤上緩存元素的最大數,這兩個屬性是 maxEntriesLocalHeap maxEntriesLocalDisk ,而對于非堆內存 OffHeap 的話是不能指定元素的最大數量的。

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

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

?

3 ?????? 大小衡量

?????? 放在 Cache 里面的元素將會使用 net.sf.ehcache.pool.sizeof.SizeOf 來衡量其大小,當然 這種衡量只是針對于存在堆內存里面的元素而言的,因為非堆內存和磁盤上我們是直接存的字節,可以直接來計算字節 。元素的大小包括元素的 key value ,以及其它屬性信息,而且在計算大小時這些信息都是遞歸計算的,即如果 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 來指定。


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

?

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

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

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

?

4 ?????? 配置大小示例

?

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

      <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>
    

?

?

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

      <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>
    

?

?

3 CacheManager 不指定大小限制, 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 擁有 500M heap 內存, 5G offHeap 內存, 50G disk 容量。 cache1 擁有 CacheManager 20% heap 內存,即 100M ,剩余的 400M cache2 cache3 平分,即各 200M cache2 擁有 CacheManager 20% offHeap 內存,即 1G ,剩余的 4G 將由 cache1 cache3 平分,即各 2G cache3 擁有 CacheManager 20% disk 容量,即 10G ,剩余的 40G 將由 cache1 cache2 平分,即各 20G 。所以最終 cache1 將擁有 heap 100M offHeap 2G disk 20G cache2 將擁有 heap 200M offHeap 1G disk 20G cache3 將擁有 heap 200M offHeap 2G disk 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 只有 600M heap 內存, cache1 cache2 cache3 都沒有顯式的指定使用多少 heap 內存,所以將各得 200M heap 內存。而 cache1 還指定了可以使用 2G offHeap 內存; 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 自身設置了 maxBytesLocalHeap 100M ,那么它能夠使用的堆內存的最大量就是 100M 。而當 Cache 自身沒有指定某種類型的容量限制時,如果在 CacheManager 級別有指定的話,那么該 Cache 將和其它同樣沒有指定該類型容量限制的 Cache 一起平分 CacheManager 級別該種類型的容量被指定了該類型容量限制的 Cache 瓜分后剩余的容量,否則其將沒有該種類型的容量可用。如當 CacheA 沒有指定 maxBytesLocalDisk 限制,而在 CacheManager 級別指定了 maxBytesLocalDisk 限制為 10G ,如果在該 CacheManager 內還有另外一個 CacheB 指定了 maxBytesLocalDisk 限制為 5G ,那么 CacheA 將能夠使用的 disk 容量為 5G ,如果此時還有另外 N Cache 也沒有指定 maxBytesLocalDisk 限制的話,那么它們將和 CacheA 一起瓜分 CacheManager disk 容量 10G 除去 CacheB disk 容量 5G 后剩余的 5G ,即各 5/(N+1)G 。如果 CacheManager 級別也沒有指定 maxBytesLocalDisk 的話,那么 CacheA 和其它同樣沒有指定 maxBytesLocalDisk Cache 將不能使用 disk 進行 Cache 信息的存儲(這里是假設這些 Cache 同樣都沒有指定 maxEntriesLocalDisk )。關于這塊如果還有不懂的,可以參考第四小節“配置大小示例”中示例。

?

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

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


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 铅山县| 阿拉善盟| 木兰县| 齐齐哈尔市| 大竹县| 肇庆市| 福泉市| 青神县| 旅游| 珲春市| 九江市| 漾濞| 个旧市| 长兴县| 长乐市| 洪洞县| 两当县| 柏乡县| 渭南市| 望奎县| 雷波县| 涟水县| 广汉市| 庄河市| 宁化县| 宁国市| 桑植县| 永寿县| 长宁县| 古蔺县| 舞钢市| 五大连池市| 汾西县| 诏安县| 乌拉特后旗| 海口市| 德化县| 通州区| 益阳市| 临城县| 长垣县|