怎麼實現保持資料庫和快取資料的一致性

2021-10-09 05:48:30 字數 728 閱讀 7700

在開發中快取的使用是特別普遍的,使用快取可以提高請求的響應速度,還可以減少請求到達db的次數。

但是當你使用快取的時候就可能面臨著快取裡面的資料和你資料庫裡面儲存的資料是不一樣的,這樣就會導致你請求到的資料都是舊資料。

解決方案:

更新資料庫,然後再刪除快取

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

更新的時候,先更新資料庫,然後再刪除快取。

但是這樣還是會有問題的,就是當你更新資料庫的時候更新成功了,但是在你刪除快取的時候刪除失敗,這個時候你就會發現快取裡面的都是舊資料,那麼你就也會導致資料不一致,所以這個方法還是會有問題的。

這裡還有乙個點就是更新資料庫,但是快取做的是刪除快取,而不是更新快取,這是你在快取裡面的資料不一定是和你更新的那個表字段是對應的,你快取裡面的資料可能是涉及到別的表,是多個表的乙個集合,所以你每次更新的話還需要進行別的表的操作就比較麻煩。還有就是當你每次更新資料庫的時候都更新快取,但是你快取更新了之後可能還沒有被訪問又要更新資料庫,這樣會導致你的開銷就比較大。所以你可以在更新資料庫的時候刪除快取,當有請求進來的時候再去查詢放入資料庫,如果沒有請求的話就不用去放入。

先刪除快取,然後更新資料庫

這樣的話你在更新資料庫的前面可以先刪除快取,然後再來更新資料庫,如果你的資料在更新資料庫的時候失敗了,但是你的快取裡面是空的,所以下次請求過來的時候回去檢視快取,快取沒有的話就會去查資料庫,這樣也就不會導致快取和資料庫資料不一致的問題了。

資料庫和快取(二)

索引種類 索引的作用 exists和in的區別 左連線 右連線 全連線 樂觀鎖 時間戳在運算元據時不加鎖,而是通過時間戳來控制併發出現的問題 悲觀鎖 修改某條資料時,不允許別人讀取該資料。可分為排他鎖和共享鎖 讀鎖和寫鎖 時間戳 在資料庫表中額外加乙個時間戳列timestamp 行級鎖 insert...

redis資料庫的快取擊穿和快取穿透

快取穿透是指查詢乙個一定不存在的資料,由於快取不命中,接著查詢資料庫也無法查詢出結果,因此也不會寫入到快取中,這將會導致每個查詢都會去請求資料庫,造成快取穿透 快取雪崩是指,由於快取層承載著大量請求,有效的保護了儲存層,但是如果快取層由於某些原因整體不能提供服務,於是所有的請求都會達到儲存層,儲存層...

聊聊資料庫和快取同步機制

快取同步的常用模式 快取同步的模式,可以按照快取的用途 主要用於讀或者寫 分為兩類 讀快取的同步和寫快取的同步。讀快取的同步 快取預載入模式 提前將資料從資料庫載入到快取,如果資料庫有寫更新,同步更新快取。在秒殺情況下,我們對商品資料就按照這種模式進行處理。快取直讀模式 應用先檢視快取中是否有該資料...