首頁 > 資料庫 > mysql教程 > 怎麼確保mysql和redis的雙寫一致性

怎麼確保mysql和redis的雙寫一致性

王林
發布: 2023-05-28 18:16:23
轉載
1204 人瀏覽過

一、場景:

雙寫一致性指的是當我們更新了資料庫的資料之後redis中的資料    也要同步去更新。使用redis讀取資料的流程,當用戶存取資料的時候,會先從快取中讀取數據,如果命中快取的話,那麼直接把快取中的資料傳回給用戶,如果快取中沒有資料的話,先查詢資料庫把查詢到的資料儲存到快取中,然後回傳給使用者。

怎麼確保mysql和redis的雙寫一致性

二、保證雙寫一致性的策略

1、先更新緩存,再更新資料庫

2、先更新資料庫,再更新快取

3、先刪除緩存,再更新資料庫

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

三,四種策略的優缺點

1、先更新緩存,再更新資料庫

問題很明顯如果更新快取成功,更新資料庫失敗,就會造成快取的髒資料

#2、先更新資料庫,再更新快取

如果再高並發的情況下,可能會存在如下的情況,線程A更新了資料庫,如果由於網路或其他的原因,線程A還來不及更新緩存,這時候有一個進程B更新了資料庫,更新了緩存,這時候進程A才更新緩存,這時候就會導致線程B對緩存的更新丟失了,像事務丟失的情況

3、先刪除緩存,再更新資料庫

這種策略可能已經避免掉了,策略2中快取遺失的情況,但是再高並發的情況下,也會有不一致的情況,例如線程A做寫操作,首先刪除緩存然後準備跟新資料庫,這時候,線程B執行了寫入操作,沒有命中緩存,然後查詢資料庫,這時候讀取的是舊值,並把查詢到的舊值保存到快取中,接著線程A完成了資料庫的更新,這時候資料庫和快取又出現了不一致的情況,解決方案:我們只要再線程A,完成資料庫的更新之後,稍作延遲再刪除一次緩存,也叫做延遲雙刪。這裡的延遲時間一定大於業務的一次讀取操作的時間。

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

再高並發的情況下,也會有不一致的情況,例如執行緒A做讀取資料的操作,正準備寫入快取的時候,線程B更新了資料庫,然後執行了刪除快取的操作,這時候線程A才把舊值寫入到快取中,雖然這種情況出現的機率比較低,因為寫入操作的時候要大於一次讀取操作的時間的。作為替換,可以將原話簡化並重新組織結構: 為處理刪除失敗的情況,建議採用延遲雙刪方案。即使延時雙刪仍存在問題,也可重複進行刪除操作,直到快取被徹底清除。如果刪除失敗,我們可以將需要刪除的鍵放入佇列中,一遍又一遍地嘗試刪除,直到刪除成功為止。

以上是怎麼確保mysql和redis的雙寫一致性的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:yisu.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板