庫(kù)存是先刪緩存還是先改db
先改db再淘汰緩存
- 緩存失效
- A讀db數(shù)據(jù)是舊值
- B改數(shù)據(jù)并淘汰緩存
- A寫入舊值到緩存中
此種方案,發(fā)生的問(wèn)題的條件比較苛刻,但也會(huì)出現(xiàn)此類問(wèn)題
先淘汰緩存再改db
- B淘汰緩存
- A讀取緩存,沒(méi)值,去讀取舊值
- B修改DB
- A把舊值寫到緩存中
此種方案,只要有讀取事件在B淘汰后修改成功前出現(xiàn),則會(huì)出現(xiàn)嚴(yán)重的臟讀問(wèn)題,需要一直等到緩存失效才會(huì)解決問(wèn)題
延遲雙刪
對(duì)于此問(wèn)題,我們常用解決方案是延遲雙刪
- 先刪除緩存
- 修改db
- 休眠x ms再淘汰緩存
休眠x的目的是為了在修改db時(shí),讓出現(xiàn)的讀事件寫緩存的過(guò)程執(zhí)行完.
為了防止淘汰緩存失敗,還需要增加重試機(jī)制(mq實(shí)現(xiàn))
為了增加吞吐量,可以把休眠ms放在協(xié)程中實(shí)現(xiàn)
讀寫分離主從情況下,休眠時(shí)間可以延長(zhǎng)一點(diǎn)