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

當前位置:首頁 > 科技  > 軟件

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

來源: 責編: 時間:2024-01-04 09:33:00 309觀看
導讀Guava Cache是一款非常優秀的本地緩存框架。這篇文章,我們聊聊如何使用 Guava Cache 異步刷新技巧帶飛系統性能 。圖片1 經典配置Guava Cache 的數據結構跟 JDK1.7 的 ConcurrentHashMap 類似,提供了基于時間、容量、引

Guava Cache是一款非常優秀的本地緩存框架。8da28資訊網——每日最新資訊28at.com

這篇文章,我們聊聊如何使用 Guava Cache 異步刷新技巧帶飛系統性能 。8da28資訊網——每日最新資訊28at.com

圖片圖片8da28資訊網——每日最新資訊28at.com

1 經典配置

Guava Cache 的數據結構跟 JDK1.7 的 ConcurrentHashMap 類似,提供了基于時間、容量、引用三種回收策略,以及自動加載、訪問統計等功能。8da28資訊網——每日最新資訊28at.com

圖片圖片8da28資訊網——每日最新資訊28at.com

首先,我們溫習下 Gauva Cache 的經典配置 。8da28資訊網——每日最新資訊28at.com

圖片圖片8da28資訊網——每日最新資訊28at.com

例子中,緩存最大容量設置為 100 (基于容量進行回收),配置了失效策略和刷新策略。8da28資訊網——每日最新資訊28at.com

  • 失效策略

配置 expireAfterWrite 后,緩存項在被創建或最后一次更新后的指定時間內會過期。8da28資訊網——每日最新資訊28at.com

  • 刷新策略

配置 refreshAfterWrite 設置刷新時間,當緩存項過期的同時可以重新加載新值 。8da28資訊網——每日最新資訊28at.com

這個例子里,有的同學可能會有疑問:為什么需要配置刷新策略,只配置失效策略不就可以嗎?8da28資訊網——每日最新資訊28at.com

當然是可以的,但在高并發場景下,配置刷新策略會有奇效,接下來,我們會寫一個測試用例,方便大家理解 Gauva Cache 的線程模型。8da28資訊網——每日最新資訊28at.com

2  理解線程模型

我們模擬在多線程場景下,「緩存過期執行 load 方法」和「刷新執行 reload 方法」兩者的運行情況。8da28資訊網——每日最新資訊28at.com

圖片圖片8da28資訊網——每日最新資訊28at.com

執行結果見下圖:8da28資訊網——每日最新資訊28at.com

圖片圖片8da28資訊網——每日最新資訊28at.com

執行結果表明:Guava Cache 并沒有后臺任務線程異步的執行 load 或者 reload 方法。8da28資訊網——每日最新資訊28at.com

失效策略:expireAfterWrite 允許一個線程執行 load 方法,其他線程阻塞等待 。當大量線程用相同的 key 獲取緩存值時,只會有一個線程進入 load 方法,而其他線程則等待,直到緩存值被生成。這樣也就避免了緩存擊穿的危險。高并發場景下 ,這樣還是會阻塞大量線程。8da28資訊網——每日最新資訊28at.com

刷新策略:refreshAfterWrite 允許一個線程執行 load 方法,其他線程返回舊的值。單個 key 并發下,使用 refreshAfterWrite ,雖然不會阻塞了,但是如果恰巧同時多個 key 同時過期,還是會給數據庫造成壓力。8da28資訊網——每日最新資訊28at.com

為了提升系統性能,我們可以從如下兩個方面來優化 :8da28資訊網——每日最新資訊28at.com

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

下圖展示優化方案的時間軸 :8da28資訊網——每日最新資訊28at.com

圖片圖片8da28資訊網——每日最新資訊28at.com

3 兩種方式實現異步刷新

3.1 重寫 reload 方法

圖片圖片8da28資訊網——每日最新資訊28at.com

3.2 實現 asyncReloading 方法

圖片圖片8da28資訊網——每日最新資訊28at.com

不管使用哪種方案, 都需要定義單獨的線程池來執行刷新任務 。8da28資訊網——每日最新資訊28at.com

4 異步刷新 + 多級緩存

2018 年,筆者服務的一家電商公司需要進行 app 首頁接口的性能優化。筆者花了大概兩天的時間完成了整個方案,采取的是兩級緩存模式,同時采用了 Guava 的異步刷新機制。8da28資訊網——每日最新資訊28at.com

整體架構如下圖所示:8da28資訊網——每日最新資訊28at.com

圖片圖片8da28資訊網——每日最新資訊28at.com

緩存讀取流程如下 :8da28資訊網——每日最新資訊28at.com

  • 業務網關剛啟動時,本地緩存沒有數據,讀取 Redis 緩存,如果 Redis 緩存也沒數據,則通過 RPC 調用導購服務讀取數據,然后再將數據寫入本地緩存和 Redis 中;若 Redis 緩存不為空,則將緩存數據寫入本地緩存中。
  • 由于步驟1已經對本地緩存預熱,后續請求直接讀取本地緩存,返回給用戶端。
  • Guava 配置了 refresh 機制,每隔一段時間會調用自定義 LoadingCache 線程池(5個最大線程,5個核心線程)去導購服務同步數據到本地緩存和 Redis 中。

優化后,性能表現很好,平均耗時在 5ms 左右,同時大幅度的減少應用 GC 的頻率。8da28資訊網——每日最新資訊28at.com

該方案依然有瑕疵,一天晚上我們發現 app 端首頁顯示的數據時而相同,時而不同。8da28資訊網——每日最新資訊28at.com

也就是說:雖然 LoadingCache 線程一直在調用接口更新緩存信息,但是各個服務器本地緩存中的數據并非完成一致。8da28資訊網——每日最新資訊28at.com

這說明了兩個很重要的點:8da28資訊網——每日最新資訊28at.com

  • 惰性加載仍然可能造成多臺機器的數據不一致;
  • LoadingCache 線程池數量配置的不太合理,  導致了任務堆積。

最終,我們的解決方案是:8da28資訊網——每日最新資訊28at.com

  • 異步刷新結合消息機制來更新緩存數據,也就是:當導購服務的配置發生變化時,通知業務網關重新拉取數據,更新緩存。
  • 適當調大 LoadingCache 的線程池參數,并在線程池埋點,監控線程池的使用情況,當線程繁忙時能發出告警,然后動態修改線程池參數。

5 總結

Guava Cache 非常強大,它并沒有后臺任務線程異步的執行 load 或者 reload 方法,而是通過請求線程來執行相關操作。8da28資訊網——每日最新資訊28at.com

為了提升系統性能,我們可以從如下兩個方面來處理 :8da28資訊網——每日最新資訊28at.com

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

筆者曾經優化過某電商網站的首頁接口,使用的方案是:Guava 的異步刷新機制 + 多級緩存 ,取得了非常好的優化效果。8da28資訊網——每日最新資訊28at.com

盡管如此,我們在使用這種方式時,依然需要考慮的緩存和數據庫一致性問題。8da28資訊網——每日最新資訊28at.com

參考資料:8da28資訊網——每日最新資訊28at.com

https://albenw.github.io/posts/df42dc84/8da28資訊網——每日最新資訊28at.com


8da28資訊網——每日最新資訊28at.com

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

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 突破 Pytorch 核心點,損失函數 ?。。?/a>

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

標簽:
  • 熱門焦點
Top 主站蜘蛛池模板: 行唐县| 广昌县| 门头沟区| 清水县| 松桃| 阳城县| 五大连池市| 海晏县| 桐乡市| 南部县| 锦州市| 霍林郭勒市| 航空| 扎鲁特旗| 四会市| 双流县| 定日县| 寿阳县| 循化| 绥芬河市| 南汇区| 枞阳县| 沙坪坝区| 天津市| 科技| 凤阳县| 偃师市| 高阳县| 阆中市| 宜丰县| 始兴县| 樟树市| 临颍县| 宿州市| 驻马店市| 叶城县| 永寿县| 铁岭市| 马山县| 咸丰县| 萨迦县|