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

2021-10-20 00:25:39 字數 1223 閱讀 2627

最經典的快取+資料庫讀寫的模式,就是 cache aside pattern。

為什麼是刪除快取,而不是更新快取?

另外更新快取的代價有時候是很高的。是不是說,每次修改資料庫的時候,都一定要將其對應的快取更新乙份?也許有的場景是這樣,但是對於比較複雜的快取資料計算的場景,就不是這樣了。如果你頻繁修改乙個快取涉及的多個表,快取也頻繁更新。但是問題在於,這個快取到底會不會被頻繁訪問到?

資料發生了變更,先刪除了快取,然後要去修改資料庫,此時還沒修改。乙個請求過來,去讀快取,發現快取空了,去查詢資料庫,查到了修改前的舊資料,放到了快取中。隨後資料變更的程式完成了資料庫的修改。完了,資料庫和快取中的資料不一樣了…

為什麼上億流量高併發場景下,快取會出現這個問題?

只有在對乙個資料在併發的進行讀寫的時候,才可能會出現這種問題。其實如果說你的併發量很低的話,特別是讀併發很低,每天訪問量就 1 萬次,那麼很少的情況下,會出現剛才描述的那種不一致的場景。但是問題是,如果每天的是上億的流量,每秒併發讀是幾萬,每秒只要有資料更新的請求,就可能會出現上述的資料庫+快取不一致的情況

解決方案如下:

高併發的場景下,該解決方案要注意的問題:

1.讀請求長時阻塞

2.讀請求併發量過高

3.多服務例項部署的請求路由

4.熱點商品的路由問題,導致請求的傾斜

Redis如何保證快取與資料庫的雙寫一致性?

原創 只要用快取,就可能會涉及到快取與資料庫雙儲存雙寫,你只要是雙寫,就一定會有資料一致性的問題 那麼,如何解決一致性問題?一般來說,如果允許快取可以稍微的跟資料庫偶爾有不一致的情況,也就是說如果你的系統不是嚴格要求快取 資料庫必須保持一致性的話,最好不要做這個方案。即 讀請求和寫請求序列化,串到乙...

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

cache aside pattern 最經典的快取 資料庫讀寫的模式,就是 cache aside pattern。讀的時候,先讀快取,快取沒有的話,就讀資料庫,然後取出資料後放入快取,同時返回響應。三種方案如下 為什麼是刪除快取,而不是更新快取?原因很簡單,很多時候,在複雜點的快取場景,快取不單...

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

只要用快取,就可能會涉及到快取與資料庫雙儲存雙寫,你只要是雙寫,就一定會有資料一致性的問題,那麼你如何解決一致性問題?一般來說,如果允許快取可以稍微的跟資料庫偶爾有不一致的情況,也就是說如果你的系統不是嚴格要求 快取 資料庫 必須保持一致性的話,最好不要做這個方案,即 讀請求和寫請求序列化,串到乙個...