日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁(yè) > 科技  > 軟件

Guava Cache 異步刷新技巧,你值得擁有!

來(lái)源: 責(zé)編: 時(shí)間:2024-01-04 09:33:00 310觀看
導(dǎo)讀Guava Cache是一款非常優(yōu)秀的本地緩存框架。這篇文章,我們聊聊如何使用 Guava Cache 異步刷新技巧帶飛系統(tǒng)性能 。圖片1 經(jīng)典配置Guava Cache 的數(shù)據(jù)結(jié)構(gòu)跟 JDK1.7 的 ConcurrentHashMap 類似,提供了基于時(shí)間、容量、引

Guava Cache是一款非常優(yōu)秀的本地緩存框架。7XG28資訊網(wǎng)——每日最新資訊28at.com

這篇文章,我們聊聊如何使用 Guava Cache 異步刷新技巧帶飛系統(tǒng)性能 。7XG28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片7XG28資訊網(wǎng)——每日最新資訊28at.com

1 經(jīng)典配置

Guava Cache 的數(shù)據(jù)結(jié)構(gòu)跟 JDK1.7 的 ConcurrentHashMap 類似,提供了基于時(shí)間、容量、引用三種回收策略,以及自動(dòng)加載、訪問(wèn)統(tǒng)計(jì)等功能。7XG28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片7XG28資訊網(wǎng)——每日最新資訊28at.com

首先,我們溫習(xí)下 Gauva Cache 的經(jīng)典配置 。7XG28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片7XG28資訊網(wǎng)——每日最新資訊28at.com

例子中,緩存最大容量設(shè)置為 100 (基于容量進(jìn)行回收),配置了失效策略和刷新策略。7XG28資訊網(wǎng)——每日最新資訊28at.com

  • 失效策略

配置 expireAfterWrite 后,緩存項(xiàng)在被創(chuàng)建或最后一次更新后的指定時(shí)間內(nèi)會(huì)過(guò)期。7XG28資訊網(wǎng)——每日最新資訊28at.com

  • 刷新策略

配置 refreshAfterWrite 設(shè)置刷新時(shí)間,當(dāng)緩存項(xiàng)過(guò)期的同時(shí)可以重新加載新值 。7XG28資訊網(wǎng)——每日最新資訊28at.com

這個(gè)例子里,有的同學(xué)可能會(huì)有疑問(wèn):為什么需要配置刷新策略,只配置失效策略不就可以嗎?7XG28資訊網(wǎng)——每日最新資訊28at.com

當(dāng)然是可以的,但在高并發(fā)場(chǎng)景下,配置刷新策略會(huì)有奇效,接下來(lái),我們會(huì)寫一個(gè)測(cè)試用例,方便大家理解 Gauva Cache 的線程模型。7XG28資訊網(wǎng)——每日最新資訊28at.com

2  理解線程模型

我們模擬在多線程場(chǎng)景下,「緩存過(guò)期執(zhí)行 load 方法」和「刷新執(zhí)行 reload 方法」兩者的運(yùn)行情況。7XG28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片7XG28資訊網(wǎng)——每日最新資訊28at.com

執(zhí)行結(jié)果見下圖:7XG28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片7XG28資訊網(wǎng)——每日最新資訊28at.com

執(zhí)行結(jié)果表明:Guava Cache 并沒有后臺(tái)任務(wù)線程異步的執(zhí)行 load 或者 reload 方法。7XG28資訊網(wǎng)——每日最新資訊28at.com

失效策略:expireAfterWrite 允許一個(gè)線程執(zhí)行 load 方法,其他線程阻塞等待 。當(dāng)大量線程用相同的 key 獲取緩存值時(shí),只會(huì)有一個(gè)線程進(jìn)入 load 方法,而其他線程則等待,直到緩存值被生成。這樣也就避免了緩存擊穿的危險(xiǎn)。高并發(fā)場(chǎng)景下 ,這樣還是會(huì)阻塞大量線程。7XG28資訊網(wǎng)——每日最新資訊28at.com

刷新策略:refreshAfterWrite 允許一個(gè)線程執(zhí)行 load 方法,其他線程返回舊的值。單個(gè) key 并發(fā)下,使用 refreshAfterWrite ,雖然不會(huì)阻塞了,但是如果恰巧同時(shí)多個(gè) key 同時(shí)過(guò)期,還是會(huì)給數(shù)據(jù)庫(kù)造成壓力。7XG28資訊網(wǎng)——每日最新資訊28at.com

為了提升系統(tǒng)性能,我們可以從如下兩個(gè)方面來(lái)優(yōu)化 :7XG28資訊網(wǎng)——每日最新資訊28at.com

  1. 配置  refresh < expire ,減少大量線程阻塞的概率;
  2. 采用異步刷新的策略,也就是線程異步加載數(shù)據(jù),期間所有請(qǐng)求返回舊的緩存值,防止緩存雪崩。

下圖展示優(yōu)化方案的時(shí)間軸 :7XG28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片7XG28資訊網(wǎng)——每日最新資訊28at.com

3 兩種方式實(shí)現(xiàn)異步刷新

3.1 重寫 reload 方法

圖片圖片7XG28資訊網(wǎng)——每日最新資訊28at.com

3.2 實(shí)現(xiàn) asyncReloading 方法

圖片圖片7XG28資訊網(wǎng)——每日最新資訊28at.com

不管使用哪種方案, 都需要定義單獨(dú)的線程池來(lái)執(zhí)行刷新任務(wù) 。7XG28資訊網(wǎng)——每日最新資訊28at.com

4 異步刷新 + 多級(jí)緩存

2018 年,筆者服務(wù)的一家電商公司需要進(jìn)行 app 首頁(yè)接口的性能優(yōu)化。筆者花了大概兩天的時(shí)間完成了整個(gè)方案,采取的是兩級(jí)緩存模式,同時(shí)采用了 Guava 的異步刷新機(jī)制。7XG28資訊網(wǎng)——每日最新資訊28at.com

整體架構(gòu)如下圖所示:7XG28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片7XG28資訊網(wǎng)——每日最新資訊28at.com

緩存讀取流程如下 :7XG28資訊網(wǎng)——每日最新資訊28at.com

  • 業(yè)務(wù)網(wǎng)關(guān)剛啟動(dòng)時(shí),本地緩存沒有數(shù)據(jù),讀取 Redis 緩存,如果 Redis 緩存也沒數(shù)據(jù),則通過(guò) RPC 調(diào)用導(dǎo)購(gòu)服務(wù)讀取數(shù)據(jù),然后再將數(shù)據(jù)寫入本地緩存和 Redis 中;若 Redis 緩存不為空,則將緩存數(shù)據(jù)寫入本地緩存中。
  • 由于步驟1已經(jīng)對(duì)本地緩存預(yù)熱,后續(xù)請(qǐng)求直接讀取本地緩存,返回給用戶端。
  • Guava 配置了 refresh 機(jī)制,每隔一段時(shí)間會(huì)調(diào)用自定義 LoadingCache 線程池(5個(gè)最大線程,5個(gè)核心線程)去導(dǎo)購(gòu)服務(wù)同步數(shù)據(jù)到本地緩存和 Redis 中。

優(yōu)化后,性能表現(xiàn)很好,平均耗時(shí)在 5ms 左右,同時(shí)大幅度的減少應(yīng)用 GC 的頻率。7XG28資訊網(wǎng)——每日最新資訊28at.com

該方案依然有瑕疵,一天晚上我們發(fā)現(xiàn) app 端首頁(yè)顯示的數(shù)據(jù)時(shí)而相同,時(shí)而不同。7XG28資訊網(wǎng)——每日最新資訊28at.com

也就是說(shuō):雖然 LoadingCache 線程一直在調(diào)用接口更新緩存信息,但是各個(gè)服務(wù)器本地緩存中的數(shù)據(jù)并非完成一致。7XG28資訊網(wǎng)——每日最新資訊28at.com

這說(shuō)明了兩個(gè)很重要的點(diǎn):7XG28資訊網(wǎng)——每日最新資訊28at.com

  • 惰性加載仍然可能造成多臺(tái)機(jī)器的數(shù)據(jù)不一致;
  • LoadingCache 線程池?cái)?shù)量配置的不太合理,  導(dǎo)致了任務(wù)堆積。

最終,我們的解決方案是:7XG28資訊網(wǎng)——每日最新資訊28at.com

  • 異步刷新結(jié)合消息機(jī)制來(lái)更新緩存數(shù)據(jù),也就是:當(dāng)導(dǎo)購(gòu)服務(wù)的配置發(fā)生變化時(shí),通知業(yè)務(wù)網(wǎng)關(guān)重新拉取數(shù)據(jù),更新緩存。
  • 適當(dāng)調(diào)大 LoadingCache 的線程池參數(shù),并在線程池埋點(diǎn),監(jiān)控線程池的使用情況,當(dāng)線程繁忙時(shí)能發(fā)出告警,然后動(dòng)態(tài)修改線程池參數(shù)。

5 總結(jié)

Guava Cache 非常強(qiáng)大,它并沒有后臺(tái)任務(wù)線程異步的執(zhí)行 load 或者 reload 方法,而是通過(guò)請(qǐng)求線程來(lái)執(zhí)行相關(guān)操作。7XG28資訊網(wǎng)——每日最新資訊28at.com

為了提升系統(tǒng)性能,我們可以從如下兩個(gè)方面來(lái)處理 :7XG28資訊網(wǎng)——每日最新資訊28at.com

  • 配置 refresh < expire,減少大量線程阻塞的概率。
  • 采用異步刷新的策略,也就是線程異步加載數(shù)據(jù),期間所有請(qǐng)求返回舊的緩存值。

筆者曾經(jīng)優(yōu)化過(guò)某電商網(wǎng)站的首頁(yè)接口,使用的方案是:Guava 的異步刷新機(jī)制 + 多級(jí)緩存 ,取得了非常好的優(yōu)化效果。7XG28資訊網(wǎng)——每日最新資訊28at.com

盡管如此,我們?cè)谑褂眠@種方式時(shí),依然需要考慮的緩存和數(shù)據(jù)庫(kù)一致性問(wèn)題。7XG28資訊網(wǎng)——每日最新資訊28at.com

參考資料:7XG28資訊網(wǎng)——每日最新資訊28at.com

https://albenw.github.io/posts/df42dc84/7XG28資訊網(wǎng)——每日最新資訊28at.com


7XG28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-57379-0.htmlGuava Cache 異步刷新技巧,你值得擁有!

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: 突破 Pytorch 核心點(diǎn),損失函數(shù) !!!

下一篇: 性能篇:String慎重使用正則表達(dá)式?

標(biāo)簽:
  • 熱門焦點(diǎn)
  • 官方承諾:K60至尊版將會(huì)首批升級(jí)MIUI 15

    全新的MIUI 15今天也有了消息,在官宣了K60至尊版將會(huì)搭載天璣9200+處理器和獨(dú)顯芯片X7的同時(shí),Redmi給出了官方承諾,K60至尊重大更新首批升級(jí),會(huì)首批推送MIUI 15。也就是說(shuō)雖然
  • 中興AX5400Pro+上手體驗(yàn):再升級(jí) 雙2.5G網(wǎng)口+USB 3.0這次全都有

    2021年11月的時(shí)候,中興先后發(fā)布了兩款路由器產(chǎn)品,中興AX5400和中興AX5400 Pro,從產(chǎn)品命名上就不難看出這是隸屬于同一系列的,但在外觀設(shè)計(jì)上這兩款產(chǎn)品可以說(shuō)是完全沒一點(diǎn)關(guān)系
  • 一年經(jīng)驗(yàn)在二線城市面試后端的經(jīng)驗(yàn)分享

    忠告這篇文章只適合2年內(nèi)工作經(jīng)驗(yàn)、甚至沒有工作經(jīng)驗(yàn)的朋友閱讀。如果你是2年以上工作經(jīng)驗(yàn),請(qǐng)果斷劃走,對(duì)你沒啥幫助~主人公這篇文章內(nèi)容來(lái)自 「升職加薪」星球星友 的投稿,坐
  • 如何正確使用:Has和:Nth-Last-Child

    我們可以用CSS檢查,以了解一組元素的數(shù)量是否小于或等于一個(gè)數(shù)字。例如,一個(gè)擁有三個(gè)或更多子項(xiàng)的grid。你可能會(huì)想,為什么需要這樣做呢?在某些情況下,一個(gè)組件或一個(gè)布局可能會(huì)
  • 三言兩語(yǔ)說(shuō)透柯里化和反柯里化

    JavaScript中的柯里化(Currying)和反柯里化(Uncurrying)是兩種很有用的技術(shù),可以幫助我們寫出更加優(yōu)雅、泛用的函數(shù)。本文將首先介紹柯里化和反柯里化的概念、實(shí)現(xiàn)原理和應(yīng)用
  • 華為發(fā)布HarmonyOS 4:更好玩、更流暢、更安全

    在8月4日的華為開發(fā)者大會(huì)2023(HDC.Together)大會(huì)上,HarmonyOS 4正式發(fā)布。自2019年發(fā)布以來(lái),HarmonyOS一直以用戶為中心,經(jīng)歷四年多的發(fā)展HarmonyOS已
  • iQOO 11S評(píng)測(cè):行業(yè)唯一的200W標(biāo)準(zhǔn)版旗艦

    【Techweb評(píng)測(cè)】去年底,iQOO推出了“電競(jìng)旗艦”iQOO 11系列,作為一款性能強(qiáng)機(jī),該機(jī)不僅全球首發(fā)2K 144Hz E6全感屏,搭載了第二代驍龍8平臺(tái)及144Hz電競(jìng)
  • 回歸OPPO兩年,一加贏了銷量,輸了品牌

    成為OPPO旗下主打性能的先鋒品牌后,一加屢創(chuàng)佳績(jī)。今年618期間,一加手機(jī)全渠道銷量同比增長(zhǎng)362%,憑借一加 11、一加 Ace 2、一加 Ace 2V三款爆品,一加
  • 榮耀Magic4 至臻版 首創(chuàng)智慧隱私通話 強(qiáng)勁影音系統(tǒng)

    2022年第一季度臨近尾聲,在該季度內(nèi),許多品牌陸續(xù)發(fā)布自己的最新產(chǎn)品,讓大家從全新的角度來(lái)了解當(dāng)今的手機(jī)技術(shù)。手機(jī)是電子設(shè)備中,更新迭代十分迅速的一款產(chǎn)品,基
Top 主站蜘蛛池模板: 屏山县| 庄河市| 常德市| 休宁县| 丰顺县| 且末县| 湟源县| 宜宾县| 桃江县| 新源县| 永寿县| 黑山县| 会理县| 衡水市| 大田县| 新乐市| 高青县| 安乡县| 会泽县| 山丹县| 米泉市| 元阳县| 融水| 专栏| 景宁| 屏东市| 永靖县| 察雅县| 桂平市| 宜昌市| 商都县| 昌江| 信丰县| 义乌市| 尼勒克县| 分宜县| 嘉义县| 漯河市| 黔南| 凌源市| 新源县|