Redis緩存和數據庫數據的一致性的實現方案

​一、前言:先來研究兩個問題

1、淘汰緩存還是更新緩存?
2、先淘汰緩存還是先更新數據庫?

二、答案如下:

1、選擇淘汰緩存

原因:數據可能爲簡單數據,也可能爲較複雜的數據,複雜數據進行緩存的更新操作,成本較高,因此一般推薦淘汰緩存

2、選擇先淘汰緩存,再更新數據庫

原因:假如先更新數據庫,再淘汰緩存,假如緩存淘汰失敗,那麼後面的請求都會得到髒數據,直至緩存過期。假如先淘汰緩存再更新數據庫,如果數據庫更新失敗,只會產生一次緩存miss,相比較而言,後者對業務影響更小一點。

三、實現緩存與數據庫一致性的策略

1、延時雙刪策略
如下場景:同時有一個請求A進行更新操作,另一個請求B進行查詢操作。
(1)請求A進行寫操作,刪除緩存
(2)請求B查詢發現緩存不存在
(3)請求B去數據庫查詢得到舊值
(4)請求B將舊值寫入緩存
(5)請求A將新值寫入數據庫
次數便出現了數據不一致問題。採用延時雙刪策略得以解決

public void write(String key,Object data){
redisUtils.del(key);
db.update(data);
Thread.Sleep(100);
redisUtils.del(key);
}
這麼做,可以將1秒內所造成的緩存髒數據,再次刪除。這個時間設定可根據俄業務場景進行一個調節。

2、數據庫讀寫分離的場景
兩個請求,一個請求A進行更新操作,另一個請求B進行查詢操作。
(1)請求A進行寫操作,刪除緩存
(2)請求A將數據寫入數據庫了,
(3)請求B查詢緩存發現,緩存沒有值
(4)請求B去從庫查詢,這時,還沒有完成主從同步,因此查詢到的是舊值
(5)請求B將舊值寫入緩存
(6)數據庫完成主從同步,從庫變爲新值
依舊採用延時雙刪策略解決此問題

問題解決,感興趣的可以關注我哦~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章