我想在我的應用程序中有幾個Cache對象,我希望他們分享最大的權重。因此,給定總重量X,我希望所有緩存中緩存項的權重總和不超過X.我不知道預先需要多少緩存,也不需要緩存'公平' - 如果一個人被大量使用而另一個人不是,那麼他應該能夠佔據全球最大份額的最大份額。我不想錯過緩存,因爲它被認爲是完整的,而其他緩存大部分是未使用的,並且該空間可以被高度使用的緩存分配。這些將使我無法回到磁盤獲取數據,所以低失誤率非常重要。創建全局(JVM)緩存最大權重的簡單方法?
我想過有一個使用靜態變量保持總緩存權重的Weigher實現。然後稱重器會返回物體的重量,如果重量小於總剩餘空間,我會按原樣返回重量。如果它超過了剩餘的總重量,我可以返回Long.MAX_VALUE,這樣該項目不會被緩存。每個緩存都有很高的最大權重,可能是Long.MAX_VALUE-1,所以只要我們可以計算/分配權重,就可以插入一個元素。
問題是,我沒有看到任何方式來知道緩存對象的總重量。我可以減少驅逐偵聽器的總重量,但是當有東西插入到緩存中時,我看不到要通知的方式,緩存統計數據也不會在其數據中反映這一點。
是否有任何解決方法可以實現此功能?我有一個處理全局權重的自定義緩存實現,但缺少Guava緩存提供的許多功能,所以我想盡可能避免重新實現。雖然我不介意嘗試將它連接到番石榴高速緩存,如果你能指出我的大方向。
您建議的Weigher不起作用,因爲具有MAX_VALUE權重的項目會刷新整個緩存。 (是的,我們可以優化它,但這並不簡單,並不清楚它是否值得。) – fry 2012-04-11 12:10:20
最接近的是Jive的[heap-bounded cache](https://github.com/Omega1/voldemort/blob/master /src/java/voldemort/store/memory/ConcurrentLinkedHashMap.java)。這是ConcurrentLinkedHashMap早期版本的一個分支,但是在它的官方版本(現在在Guava中)實現算法之前。它爲他們工作,作爲soft-ref(高GC懲罰)的替代方案,但通常不足以成爲Guava緩存庫的一部分。 – 2012-04-12 05:39:44
本,謝謝你的指針,我會檢查一下。 @fry,一旦我深入瞭解代碼,我就會意識到MAX_VALUE。對ConstrainedCache有沒有任何想法 - 將它與約束已有的約束結合起來。這可以讓我在約束中定義全局權重,並且可能對我來說至少是一個好的解決方案。 – Michael 2012-04-12 12:10:12