亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

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

系統(tǒng) 2034 0

設(shè)置緩存的大小

?

目錄

1???? CacheManager 級別

2???? Cache 級別

3???? 大小衡量

4???? 配置大小示例

?

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

?

1 ?????? CacheManager 級別

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

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

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

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

?????? 下面是一個在 CacheManager 級別指定緩存大小限制的示例,在該示例中我們指定了該 CacheManager 所能使用的最大堆內(nèi)存是 500M ,最大非堆內(nèi)存是 2G ,使用本地磁盤的最大字節(jié)數(shù)是 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 上能夠指定的限制大小的參數(shù)在 Cache 級別都能使用。當(dāng)我們在 Cache 級別指定了某種類型的限制大小后,該 Cache 將不再共享 CacheManager 內(nèi)的該種限制了。如我們在 CacheManager 級別限制了堆內(nèi)存的最大使用數(shù) maxBytesLocalHeap 1G ,意味著 CacheManager 內(nèi)的所有的 Cache 將共享這 1G 的堆內(nèi)存,如果這個時候我們指定 CacheManager 內(nèi)的 cache1 的最大使用堆內(nèi)存數(shù) maxBytesLocalHeap 200M ,那就意味著 cache1 的堆內(nèi)存最大使用數(shù)只能是其自身設(shè)置的 200M 了,而其它 Cache 只能共享剩余的 824M 了。

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

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

?

??????

?????? 此外,在 Cache 級別我們還可以利用兩個屬性來限制在堆內(nèi)存或者是磁盤上緩存元素的最大數(shù),這兩個屬性是 maxEntriesLocalHeap maxEntriesLocalDisk ,而對于非堆內(nèi)存 OffHeap 的話是不能指定元素的最大數(shù)量的。

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

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

?

3 ?????? 大小衡量

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

?????? IgnoreSizeOf 可以標(biāo)記在三個地方。

?????? 1 屬性上 :表示忽略某對象的對應(yīng)屬性。如下表示我們將忽略 User 對象的 role 屬性。

      public class User {
 
   @IgnoreSizeOf
   private Role role;
  
}
    

?

?

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

      @IgnoreSizeOf
public class User {
 
   private String name;
  
}
    

?

?

?????? 3 包上 :標(biāo)記在包上的時候是標(biāo)記在包對應(yīng)的 package-info.java 上,表示將忽略該包下面所有的類型,如我們要忽略 com.xxx.xxx 包下的所有內(nèi)容時可以在該包對應(yīng)的 package-info.java 文件中的 package 上使用 IgnoreSizeOf 注解進行標(biāo)注。

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

?

?

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


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

?

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

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

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

?

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 的堆內(nèi)存,而 cache2 cache3 將平分 CacheManager 級別除去 cache1 所擁有的 200M 之外的堆內(nèi)存,即各 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 級別指定大小限制。這個時候?qū)⒏饔酶鞯模锤鱾€ 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 )當(dāng)我們在 CacheManager 級別指定了大小限制之后,我們可以在 Cache 級別通過百分比的形式來指定其可使用的對應(yīng)大小限制。在下面示例中,我們的 CacheManager 擁有 500M heap 內(nèi)存, 5G offHeap 內(nèi)存, 50G disk 容量。 cache1 擁有 CacheManager 20% heap 內(nèi)存,即 100M ,剩余的 400M cache2 cache3 平分,即各 200M cache2 擁有 CacheManager 20% offHeap 內(nèi)存,即 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 )當(dāng)我們沒有在 CacheManager 上指定某種資源的可用量時我們還可以在 Cache 級別進行指定。 CacheManager 只有 600M heap 內(nèi)存, cache1 cache2 cache3 都沒有顯式的指定使用多少 heap 內(nèi)存,所以將各得 200M heap 內(nèi)存。而 cache1 還指定了可以使用 2G offHeap 內(nèi)存; cache2 還指定了可以使用 20G 的磁盤;而 cache3 僅僅只能使用 CacheManager 分配下來的 200M heap 內(nèi)存。

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

?

?

?????? 總之,當(dāng) Cache 自身設(shè)置了某種容量的限制時,在對應(yīng)類型的容量限制上將使用自身的限制,如某 Cache 自身設(shè)置了 maxBytesLocalHeap 100M ,那么它能夠使用的堆內(nèi)存的最大量就是 100M 。而當(dāng) Cache 自身沒有指定某種類型的容量限制時,如果在 CacheManager 級別有指定的話,那么該 Cache 將和其它同樣沒有指定該類型容量限制的 Cache 一起平分 CacheManager 級別該種類型的容量被指定了該類型容量限制的 Cache 瓜分后剩余的容量,否則其將沒有該種類型的容量可用。如當(dāng) CacheA 沒有指定 maxBytesLocalDisk 限制,而在 CacheManager 級別指定了 maxBytesLocalDisk 限制為 10G ,如果在該 CacheManager 內(nèi)還有另外一個 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 信息的存儲(這里是假設(shè)這些 Cache 同樣都沒有指定 maxEntriesLocalDisk )。關(guān)于這塊如果還有不懂的,可以參考第四小節(jié)“配置大小示例”中示例。

?

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

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


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

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

【本文對您有幫助就好】

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

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 大乳妇女bd视频在线观看 | 国产精品线在线精品 | 亚洲另类图 | 一级肉体毛片视频免费看看 | 国产欧美一区二区 | 久久99蜜桃精品久久久久小说 | 亚洲国产成人精品区 | 婷婷色婷婷| 激情五月社区 | 亚洲精品一区二区三区国产 | 综合网天天操天天射 | 亚洲国产成人久久综合一区77 | 男人的天堂久久精品激情 | 夜夜夜网站 | 久在草在线 | 亚洲在线视频免费 | 免费看欧美一级特黄a毛片 免费看欧美一级特黄α大片 | 四虎国产永久在线精品免费观看 | 99热热久久这里只有精品166 | 欧美另类交视频 | 日本在线一卡二卡毛片 | 91福利精品老师国产自产在线 | 日韩欧美第一区二区三区 | 国产精品不卡在线观看 | 日本中文一二区有码在线观看 | 久久综合精品国产一区二区三区无 | 国产日韩欧美一区二区 | 久久影院在线观看 | 成人短视频在线免费观看 | 日韩欧美亚洲国产 | 黄 色 三 级 网站 | 国产成人午夜精品影院游乐网 | 天天干天天弄 | 久久91亚洲精品久久91综合 | 91最新入口| 欧美激情久久欧美激情 | 在线观看亚洲 | 中文字幕亚洲欧美日韩高清 | 亚洲精品国产高清不卡在线 | 成人精品mv视频在线观看 | 一级全黄色毛片 |