首頁 > 易卦

如何保證資料庫與快取資料一致性?

作者:由 程式那點事 發表于 易卦日期:2022-08-12

快取資料庫雙寫不一致怎麼解決

前言

在實際的專案開發中,為了提高響應的速度,通常都會將熱點的資料儲存到快取中,減少資料庫的查詢,有效提高服務端的響應速度,但是新增快取之後也引入快取與資料庫的一致性問題,本文將詳細的講解如何保證資料庫與快取的一致性。

快取使用策略

在使用快取時,通常的快取冊率有如下幾種:

Cache-Aside Pattern(旁路快取,業務系統常用)

Read-Through Pattern

Write-Through Pattern

Write-Behind Pattern

Cache-Aside Pattern(旁路快取模式)

Cache-Aside Pattern 簡稱旁路快取模式,讀取快取、讀取資料庫和更新快取的操作都是在應用系統中完成,也是業務系統最常用的快取策略。然而旁路路由策略又分為讀快取和寫快取。

讀快取

如何保證資料庫與快取資料一致性?

說明:

應用程式需要從資料庫讀取資料時,先檢查快取資料是否命中。

如果快取未命中,則查詢資料庫獲取資料,同時將資料寫到快取中,以便後續讀取相同資料會命中快取,最後再把資料返回給呼叫者。

如果快取命中,直接返回呼叫者。

寫快取

如何保證資料庫與快取資料一致性?

寫快取的流程就比較簡單,先更新資料庫中的資料,然後刪除舊的快取即可。

Cache-Aside Pattern 一致性問題場景分析

實際的專案中運用最多的為Cache-Aside Pattern(旁路快取)模式,在此策略下客戶端先讀取快取,如果命中則返回,如果沒有命中,則查詢資料庫併發資料寫入快取,由於資料庫和快取都需要進行修改,在高併發的場景下,可能會導致資料不一致,針對資料不一致的場景,提供了四種更新方案具體如下:

先更新快取,再更新資料庫。

先更新資料庫,再更新快取。

先刪除快取,再更新資料庫。

先更新資料庫,再刪除快取。

接下來具體來講解四種方案的,以及四種方案存在的問題。

先更新快取,再更新資料庫。

如何保證資料庫與快取資料一致性?

流程說明: 執行緒1:先更新快取成功,但是網路原因寫資料庫失敗,就會導致快取是最新資料,而資料庫的資料為舊資料,那快取就是髒資料, 執行緒2:讀取快取中資料,而這個資料資料庫中卻不存在,資料庫都不存在的資料,快取並返回客戶端就毫無意義了。

此方案在實際生產中不建議採用。

先更新資料庫,再更新快取。

如何保證資料庫與快取資料一致性?

流程說明:

執行緒1先更新資料庫成功,但是由於網路卡頓更新快取失敗,從而導致快取中的資料為舊資料

執行緒2從快取中讀取資料,快取中的資料為舊數,從而導致資料庫與快取資料不一致。

此方案在實際生產中不建議採用。

先刪除快取,再更新資料庫。

如何保證資料庫與快取資料一致性?

流程說明:

執行緒1,先刪除快取成功,但是由於網路卡頓原因,更新資料庫異常。

執行緒2,讀取快取由於快取資料為空,則會查詢資料庫中的資料,查詢成功並寫入快取,從而導致資料不一致。

此方案在實際生產中不建議採用。

先更新資料庫,再刪除快取。

如何保證資料庫與快取資料一致性?

流程說明:

執行緒1寫入資料庫成功,由於網路卡頓原因,導致刪除快取資料失敗

執行緒2讀取資料,讀取為快取中的資料,但是當網路恢復正常後,快取中的資料會被刪除,所以可能會存在短暫的資料不一致。

雖然存在短暫的資料不一致,但是在旁路快取策略的時候,對於寫的操作:先更新資料庫,再刪除快取。

資料庫和快取一致性解決方案

快取延遲雙刪

快取延遲雙刪針對第三種場景的最佳化,具體的流程如下:

如何保證資料庫與快取資料一致性?

說明:先刪除快取,在更新資料庫,確保資料庫事務提交成功,然後休眠一段時間在刪除快取。我們都知道第三種情況是因為網路卡頓導致資料庫更新失敗,當網路恢復正常後,我們在執行更新資料庫操作,然後再刪除快取,那麼出現數據不一致的情況也就是在休眠的這短暫的時間內。

刪除快取失敗如何處理

刪除快取重試機制

如何保證資料庫與快取資料一致性?

需要刪除失敗的key存入訊息佇列中,採用非同步的方式來進行刪除,如果刪除失敗的次數已經超過了最大次數,傳送警告郵件,需要人工介入解決。

總結

本文對於資料庫和快取的一致性進行詳細的講解,由於資料庫和快取一致性的場景比較複雜,每種方案都無法保證絕對的一致性,根據CAP理論我們知道快取系統使用場景為非強一致性的場景,符合CAP中的AP,如有疑問請及時反饋。

作者:劍聖無痕

連結:

https://juejin。cn/post/7126188464713760776