快取失效竟然可以這麼解決?

2021-08-02 18:34:59 字數 1185 閱讀 5562

資料傳輸提供的資料訂閱功能,可以在不影響業務的情況下,實現簡單、可靠的快取失效邏輯。這種快取失效機制為阿里巴巴多年架構優化沉澱下來的經驗,下面我們一起來看資料訂閱究竟怎麼實現這種機制。

為了提高業務訪問速度,提公升業務讀併發,很多使用者都會在業務架構中引入快取層。業務所有讀請求全部路由到快取層,通過快取的記憶體讀取機制大大提公升業務讀取效能。快取中的資料不能持久化 ,一旦快取異常退出,那麼記憶體中的資料就會丟失,所以為了保證資料完整,業務的更新資料會落地到持久化儲存中,例如db。目前雲使用者的業務架構一般如下圖:

在上圖中,大家可以看到,使用者的更新資料直接持久化到db, 業務讀請求直接請求快取資料,所以業務需要解決快取失效問題,即解決因為資料變更導致快取中的資料失效的問題。 目前業務解決快取失效問題的解決方法一般是業務實現db、快取雙寫。通過業務雙寫解決快取失效,存在如下的問題:

**侵入性比較強,需要雙寫兩份儲存,任何對db的資料變更,都需要同時更新快取,**層面後期可維護程度不高

使用者請求執行緒裡同步呼叫快取,對快取存在強以來,遇到快取超時等異常時,沒有辦法做到有效的重試,遇到異常給使用者返回系統錯誤、操作失敗等資訊,嚴重影響使用者體驗

使用者請求執行緒裡同步完成db、快取雙寫,變更請求鏈路長,訪問延遲大,影響使用者體驗

在阿里巴巴內部同樣也遇到了快取失效的問題,隨著業務架構得不斷調整優化,我們已經沉澱出一套高可靠、極優雅得快取失效架構。即通過資料傳輸提供的資料訂閱功能,非同步獲取db(例如公共雲上的rds)的增量資料,根據增量資料進行快取失效。具體的架構類似下圖:

在這個架構裡面,快取更新流程如下:

業務完成db更新後即返回請求

資料訂閱通過日誌解析方式實時解析並訂閱db的增量更新資料,當發現db有資料更新時,將增量資料推送給下游消費者

下游消費業務一旦接收到增量更新資料,即呼叫消費執行緒進行快取更新

至此完成整個快取更新過程。

從上面的快取失效流程,可以看出這種快取失效機制:

更新路徑短,延遲低: 快取失效為非同步流程,業務更新db完成後直接返回,不需要關心快取失效流程,整個更新路徑短,更新延遲低

應用簡單可靠:應用無需實現複雜雙寫邏輯,只需啟動非同步執行緒監聽增量資料,更新快取資料即可

應用更新無效能消耗:因為資料訂閱是通過解析db的增量日誌來獲取增量資料,獲取資料的過程對業務、db效能無損

驚呆了!map竟然可以實現快取的功能!!

經理讓我實現乙個註冊驗證碼的乙個功能,由於專案剛剛做,暫時不考慮redis快取什麼的。我之前做過這種功能,直接用了redis快取,輕鬆愉快,很快就能寫好。不用redis做,這下有點慌了,於是我就各種查閱資料,於是就查到了map可以簡單的當作快取使用。下面貼一下過程。private mapmap ne...

快取失效 快取穿透 快取併發及其解決方案

問題描述 引起這個原因的主要因素是高併發下,我們一般設定乙個快取的過期時間時,可能有一些會設定5分鐘啊,10分鐘這些 併發很高時可能會出在某乙個時間同時生成了很多的快取,並且過期時間在同一時刻,這個時候就可能引發 當過期時間到後,這些快取同時失效,請求全部 到db,db可能會壓力過重。處理方法 乙個...

關於快取穿透 快取併發 快取失效的解決方案

一 快取穿透 二 快取併發 有時候如果 併發訪問高,乙個快取如果失效,可能出現多個程序同時查詢db,同時設定快取的情況,如果併發確實很大,這也可能造成db壓力過大,還有快取頻繁更新的問題。三 快取失效 引起這個問題的主要原因還是高併發的時候,平時我們設定乙個快取的過期時間時,可能有一些會設定5分鐘啊...