緩存加載器
CacheLoader是一個抽象類,它指定如何計算或加載值(如果不存在)。 有兩種方法可以創建CacheLoader實例:
- 擴展CacheLoader <K,V>類
- 使用靜態工廠方法CacheLoader.from
如果擴展CacheLoader,則需要重寫V load(K key)
方法,以指示如何為給定鍵生成值。 使用靜態CacheLoader.from
方法,可以通過提供Function或Supplier接口來構建CacheLoader。 提供功能對象時,會將功能應用于鍵以計算或檢索結果。 使用供應商界面獲取的值與密鑰無關。
CacheBuilder
CacheBuilder用于構造緩存實例。 它使用流暢的構建樣式,并提供了在緩存上設置以下屬性的選項:
- 緩存大小限制(刪除使用LRU算法)
- 在WeakReferences中包裝鍵(默認情況下,鍵使用強引用)
- 包裝WeakReferences或SoftReferences中的值(默認使用強引用)
- 最后一次訪問后到期的時間
- 寫入或更新后條目的基于時間的到期
- 設置一個RemovalListener,一旦從緩存中刪除一個條目,就可以接收事件
- 緩存的并發級別(默認為4)
并發級別選項用于在內部對表進行分區,以便可以在不發生爭用的情況下進行更新。 理想的設置是一次可能訪問高速緩存的最大線程數。 這是Guava緩存可能的使用場景的示例。
public class PersonSearchServiceImpl implements SearchService<List<Person>> {public PersonSearchServiceImpl(SampleLuceneSearcher luceneSearcher, SampleDBService dbService) {this.luceneSearcher = luceneSearcher;this.dbService = dbService;buildCache();}@Overridepublic List<Person> search(String query) throws Exception {return cache.get(query);}private void buildCache() {cache = CacheBuilder.newBuilder().expireAfterWrite(10, TimeUnit.MINUTES).maximumSize(1000).build(new CacheLoader<String, List<Person>>() {@Overridepublic List<Person> load(String queryKey) throws Exception {List<String> ids = luceneSearcher.search(queryKey);return dbService.getPersonsById(ids);}});}
}
在此示例中,我將緩存條目設置為在寫入或更新到緩存中10分鐘后過期,最大數量為1,000次。 注意第15行上CacheLoader的用法。
RemovalListener
RemovalListener將收到有關從緩存中刪除項目的通知。 這些通知可能來自手動失效,也可能來自由于時間到期或垃圾收集而引起的自動失效。 可以將RemovalListener <K,V>參數設置為偵聽特定類型。 要接收任何鍵或值的通知,請將它們設置為使用對象。 這里應該注意,RemovalListener將接收實現Map.Entry接口的RemovalNotification <K,V>對象。 如果其中一個已被垃圾回收,則鍵或值可以為null。 同樣,鍵和值對象將是強引用,而不管高速緩存使用的引用的類型如何。
緩存狀態
還有一個非常有用的CacheStats類,可以通過調用Cache.stats()來檢索它。 CacheStats對象可以給
通過提供以下統計信息,了解緩存的有效性和性能:
- 命中數
- 錯過計數
- 總負荷時間
- 總要求
除了上面列出的計數外,CacheStats還提供許多其他計數。
結論
Guava緩存提供了一些非常引人注目的功能。 使用番石榴緩存的決定實際上歸結為內存可用性/使用率與性能提升之間的權衡。 我添加了一個單元測試CacheTest,以演示此處討論的用法。 總是歡迎提出意見和建議。 謝謝你的時間。
資源資源
- 番石榴項目首頁
- 緩存API
- 博客系列的源代碼
參考: “ 隨機編碼思考”博客上的JCG合作伙伴 Bill Bejeck的Google Guava Cache 。
翻譯自: https://www.javacodegeeks.com/2012/11/google-guava-cache.html