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

2021-09-22 21:27:23 字數 1007 閱讀 3653

cache aside pattern

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

讀的時候,先讀快取,快取沒有的話,就讀資料庫,然後取出資料後放入快取,同時返回響應。

三種方案如下:

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

原因很簡單,很多時候,在複雜點的快取場景,快取不單單是資料庫中直接取出來的值。更新操作開銷大多,而這一時段如果讀少則造成程式的開銷增大。

這種方案也是程式在用的,同時也是與程式松耦合的方案。針對資料庫更新成功,快取刪除失敗的情況,canal監控到變化則資料庫更新成功,快取刪除失敗增加了訊息佇列進行重試機制。

canal監控mysql的變化,如果資料更新,則進行刪除快取操作,如果刪除快取失敗,則把刪除操作放入訊息佇列中,自己進行消費該訊息進行刪除重試。

以及這種方案詳細內容**

更新資料庫的時候,根據資料的唯一標識,將操作路由之後,傳送到乙個 jvm 內部佇列中。讀取資料的時候,如果發現資料不在快取中,那麼將重新讀取資料+更新快取的操作,根據唯一標識路由之後,也傳送同乙個 jvm 內部佇列中。

即更新資料庫快取操作,讀取資料時(快取不存在)放到記憶體佇列中,同時讀取資料等待佇列處理超時問題(超時先查詢資料庫返回)

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

超時返回,同時提前做好服務到壓測跟預估

nginx路由到相同服務事例上

更多詳細的介紹參看文章:

總結:

其實秒殺商品的庫存大部分都是存放到redis中,庫存只更新快取的。

先刪除快取再更新資料庫,存在快取擊穿問題(大量讀請求過來,都走了資料庫),同時增加了**複雜性。

先更新資料庫,再刪除快取,通過松耦合的情況,大部分場景能滿足。

當然特殊場景需要特殊策略對待。

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

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

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

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

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

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