雙寫一致性指的是當我們更新了資料庫的資料之後redis中的資料 也要同步去更新。使用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中文網其他相關文章!