Google Guava緩存

這篇文章是我在Google Guava上系列文章的續篇,這次涵蓋了Guava Cache。 與HashMap或ConcurrentHashMap相比,Guava Cache提供了更大的靈活性和功能,但不像使用EHCache或Memcached那樣繁重(就此而言,它很健壯,因為Guava Cache僅在內存中運行)。 Cache接口具有您希望看到的方法,例如“ get”和“ invalidate”。 您找不到的方法是'put',因為Guava Cache是??'self-populated',因此將獲取或計算在請求時不存在的值,然后將其存儲。 這意味著“ get”調用將永遠不會返回null。 公平地說,上一聲明并非100%準確。 還有另一種方法“ asMap”,將緩存中的條目公開為線程安全映射。 使用'asMap'將導致不執行任何自加載操作,因此,如果不存在該值,則對'get'的調用將返回null(這有什么意思?)。 盡管這是有關Guava Cache的文章,但我將花大量時間談論CacheLoader和CacheBuilder。 CacheLoader指定如何加載值,并且CacheBuilder用于設置所需的功能并實際構建緩存。

緩存加載器

CacheLoader是一個抽象類,它指定如何計算或加載值(如果不存在)。 有兩種方法可以創建CacheLoader實例:

  1. 擴展CacheLoader <K,V>類
  2. 使用靜態工廠方法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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/370703.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/370703.shtml
英文地址,請注明出處:http://en.pswp.cn/news/370703.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

html 三列布局(兩列自適應,一列固定寬度)

不做過多解釋&#xff1a;主要是記錄一個完整的布局樣式&#xff0c;實現頁面大致三列其中左右兩列是自適應寬度&#xff0c;中間固定寬度效果。 不多少代碼奉上&#xff1a; CSS樣式代碼&#xff1a; /*********************公共標簽樣式********************//************…

jsp常用動作

jsp:include 動態包含&#xff1b; jsp:forward 轉發&#xff1b; jsp:useBean 實例化bean對象&#xff1b; jsp:setProperty 設置一個屬性值 jsp:getProperty 獲取一個屬性值 jsp:param 動態傳參數&#xff1b; jsp:plugin 生成一個插件 jsp:useBean 實例化一個對象…

單曲循環 翻譯_歌單 | 單曲循環amp;熱評

December2020/12/ 寫在前面的話 /本來打算在跨年的時候才更文&#xff0c;但是吧又覺得空出這最后一個月有點蒼白&#xff0c;然后最近一直夜半網抑云(敏感ing)就想到可以做一期分享歌單的推文&#xff0c;分享一些最近聽得頻繁的歌曲(還不是刷抖音刷出來的)。《曖昧》// 王菲徘…

python的字符串內建函數

python的字符串內建函數 字符串方法是從python1.6到2.0慢慢加進來的——它們也被加到了Jython中。 這些方法實現了string模塊的大部分方法&#xff0c;如下表所示列出了目前字符串內建支持的方法&#xff0c;所有的方法都包含了對Unicode的支持&#xff0c;有一些甚至是專門用…

休息使用Jersey –包含JAXB,異常處理和客戶端程序的完整教程

最近&#xff0c;我開始使用Jersey API開發一個Restful Web服務項目。 在線提供了一些教程&#xff0c;但是我遇到了異常處理方面的一些問題&#xff0c;而且在使用JaxB和提供異常處理方法的完整項目中找不到任何地方。 因此&#xff0c;一旦我能夠使用帶有異常處理和客戶端程序…

python基于web可視化_獨家 | 基于Python實現交互式數據可視化的工具(用于Web)

轉自&#xff1a;數據派ID&#xff1a;datapi 作者&#xff1a;Alark Joshi 翻譯&#xff1a;陳雨琳 校對&#xff1a;吳金笛 本文2200字&#xff0c;建議閱讀8分鐘。 本文將介紹實現數據可視化的軟件包。 這學期&#xff08;2018學年春季學期&#xff09;我教授了一門關于數據…

SASS簡介及使用方法

一、什么是Sass Sass (Syntactically Awesome StyleSheets)是css的一個擴展開發工具&#xff0c;它允許你使用變量、條件語句等&#xff0c;使開發更簡單可維護。這里是官方文檔。 二、基本語法 1&#xff09;變量 sass的變量名必須是一個$符號開頭&#xff0c;后面緊跟變量名…

【轉】Java方向如何準備BAT技術面試答案(匯總版)

原文地址&#xff1a;http://www.jianshu.com/p/1f1d3193d9e3 這個主題的內容之前分三個篇幅分享過&#xff0c;導致網絡上傳播的比較分散&#xff0c;所以本篇做了一個匯總&#xff0c;同時對部分內容及答案做了修改&#xff0c;歡迎朋友們吐槽、轉發。因為篇幅長度和時間的原…

numpy維度交換_“lazy”的transpose()函數——從numpy 數組的內存布局講起

1 數組的兩種內存布局方式行優先與列優先首先我們回顧一下&#xff0c;矩陣數據在內存中的兩種布局方式&#xff1a;行優先&#xff08;row-major&#xff09;&#xff1a;以行為優先單位&#xff0c;在內存中逐行存儲/讀取&#xff1b;對于多維&#xff0c;意味著當線性掃描內…

云耀服務器切換系統,【計算】云耀服務器-常見操作匯總指南

通過上期的介紹&#xff0c;相信大家對于云耀云服務器的基本知識有了一個了解。云耀云服務器是一個具備獨立、完整的操作系統和網絡功能&#xff0c;可快速搭建簡單應用的新一代云服務器。接下來&#xff0c;本期為大家帶來關于云耀云服務器使用中的一些簡單方法和小技巧。1.云…

機器學習應該準備哪些數學預備知識?

轉 https://www.zhihu.com/question/36324957 https://www.zhihu.com/question/36324957/answer/139408269 機器學習應該準備哪些數學預備知識&#xff1f; 數據分析師&#xff0c;工作中經常使用機器學習模型&#xff0c;但是以調庫為主。 自己一直也在研究算法&#xff0c;也…

react usecontext_Vue3原理實戰運用,我用40行代碼把他裝進了React做狀態管理

前言vue-next是Vue3的源碼倉庫&#xff0c;Vue3采用lerna做package的劃分&#xff0c;而響應式能力vue/reactivity被劃分到了單獨的一個package中。如果我們想把它集成到React中&#xff0c;可行嗎&#xff1f;來試一試吧。使用示例話不多說&#xff0c;先看看怎么用的解解饞吧…

Spring MVC –自定義RequestMappingHandlerMapping

在xml bean定義文件中使用<mvc&#xff1a;annotation-driven />配置Spring MVC時&#xff0c;在內部將一個名為RequestMappingHandlerMapping的組件注冊到Spring MVC。 該組件或通常是HandlerMapping組件負責將請求URI路由到處理程序&#xff0c;這些處理程序是使用Requ…

css的三個特性 背景透明設置

關于行內元素&#xff08;補充一點&#xff09; 行內元素只能容納文本或其他行內元素。&#xff08;a特殊a里面可以放塊級元素&#xff09; 例子&#xff1a; 關于行高tip: 選擇器的嵌套層級不應大于3級&#xff0c;位置靠后的限定條件應盡可能的精確。 屬性定義必須另起一行…

比較容易犯的一些智障錯誤(不定時修改)

無論在什么學習中&#xff0c;在成長的過程中&#xff0c;注定要犯一些錯誤&#xff0c;有些比較高級的錯誤&#xff0c;有些是比較智障的錯誤。那么在oi的學習中&#xff0c;我們最討厭的就是一些智障的小錯誤&#xff0c;因為如果是大錯誤的話一般情況下在測試樣例的時候都是…

ccs安裝多版本編譯器離線_大數據分析:學習工具JDK,在線安裝指南

hadoop是使用Java語言開發的并且Hadoop運行需要有Java環境的支持&#xff0c;因此在安裝hadoop之前需要安裝Java開發環境即JDK(Java Development Kit)。安裝前首先向大家介紹以一下本文會用到的幾個詞&#xff1a;JAVA_HOME:一是為了方便引用&#xff0c;比如&#xff0c;JDK安…

HTML基礎入門學習準備篇

在學習前端的開始&#xff0c;讓我們一起來了解什么是HTML5時代的大前端開發和全棧開發的定義傳統的前端&#xff1a;切圖-標簽和樣式-實現效果H5時代的前端&#xff1a;一、需要各端的兼容開發二、可以用于APP開發和移動站點的開發三、Ajax服務器端技術開發四、高級設計模式和…

asp.net尚未在web服務器上注冊_最新版Web服務器項目詳解 00 項目概述

點 擊 關 注 上 方&#xff02;兩猿社&#xff02;設 為&#xff02;置 頂 或 星 標&#xff02;&#xff0c;干 貨 第 一 時 間 送 達。互 聯 網 猿 | 兩 猿 社TineyWebServerLinux下C輕量級Web服務器&#xff0c;助力初學者快速實踐網絡編程&#xff0c;搭建屬于自己的服務器…

python正則r的作用_Python正則表達式,這一篇就夠了!

原標題&#xff1a;Python正則表達式&#xff0c;這一篇就夠了&#xff01;大多數編程語言的正則表達式設計都師從Perl&#xff0c;所以語法基本相似&#xff0c;不同的是每種語言都有自己的函數去支持正則&#xff0c;今天我們就來學習 Python中關于 正則表達式的函數。re模塊…

服務器微信了早上好,每天早上好的問候語 微信早安問候語合集66句

1、沒有傘的孩子&#xff0c;必須努力奔跑&#xff01;早安&#xff01;2、你不能改變過去&#xff0c;但你可以改變未來。早安&#xff01;3、堅持了才叫夢想&#xff0c;放棄了就只是妄想。早安&#xff01;4、忘掉失敗&#xff0c;不過要牢記失敗中的教訓。早安&#xff01;…