究竟先操作快取,還是資料庫?
究竟先操作快取,還是資料庫?
2018年07月09日 20:20:00 架構師之路_ 閱讀數:1007
版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/z50L2O08e2u4afToR9A/article/details/80976862
快取儲存,也是資料的冗餘。
(1)資料庫訪問資料,磁碟IO,慢;
(2)快取裡訪問資料,存操作,快;
(3)資料庫裡的熱資料,可在快取冗餘一份;
(4)先訪問快取,如果命中,能大大的提升訪問速度,降低資料庫壓力;
這些,是快取的核心讀加速原理。
但是,一旦沒有命中快取,或者一旦涉及寫操作,流程會比沒有快取更加複雜,這些是今天要分享的話題。
讀操作,如果沒有命中快取,流程是怎麼樣的?
答:如下圖所示
(1)嘗試從快取get資料,結果沒有命中;
(2)從資料庫獲取資料,讀從庫,讀寫分離;
(3)把資料set到快取,未來能夠命中快取;
讀操作的流程應該沒有歧義。
寫操作,流程是怎麼樣的?
答:寫操作,既要運算元據庫中的資料,又要操作快取裡的資料。
這裡,有兩個方案:
(1)先運算元據庫,再操作快取;
(2)先操作快取,再運算元據庫;
並且,希望保證兩個操作的原子性,要麼同時成功,要麼同時失敗。
這演變為一個分散式事務的問題,保證原子性十分困難,很有可能出現一半成功,一半失敗,接下來看下,當原子性被破壞的時候,分別會發生什麼。
一、先運算元據庫,再操作快取
如上圖,正常情況下:
(1)先運算元據庫,成功;
(2)再操作快取(delete或者set),也成功;
但如果這兩個動作原子性被破壞:第一步成功,第二步失敗,會導致,資料庫裡是新資料,而快取裡是舊資料,業務無法接受。
畫外音:如果第一步就失敗,可以返回撥用方50X,不會出現資料不一致。
二、先操作快取,再運算元據庫
如上圖,正常情況下:
(1)先操作快取(delete或者set),成功;
(2)再運算元據庫,也成功;
畫外音:如果第一步就失敗,也可以返回撥用方50X,不會出現資料不一致。
如果原子性被破壞,會發生什麼呢?
這裡又分了兩種情況:
(1)操作快取使用set
(2)操作快取使用delete
使用set的情況:第一步成功,第二步失敗,會導致,快取裡是set後的資料,資料庫裡是之前的資料,資料不一致,業務無法接受。
並且,一般來說,資料最終以資料庫為準,寫快取成功,其實並不算成功。
使用delete的情況:第一步成功,第二步失敗,會導致,快取裡沒有資料,資料庫裡是之前的資料,資料沒有不一致,對業務無影響。只是下一次讀取,會多一次cache miss。
畫外音:此時可以返回撥用方50X。
最終,先操作快取,還是先運算元據庫?
答:
(1)讀請求,先讀快取,如果沒有命中,讀資料庫,再set回快取
(2)寫請求
(2.1)先快取,再資料庫
(2.2)快取,使用delete,而不是set
畫外音:《快取,究竟是淘汰,還是修改?》也提到了,淘汰快取還是修改快取的建議。
希望大家有收穫,有不同方案歡迎討論。
末了,挖個坑:
在快取讀取流程中,如果主從沒有同步完成,步驟二讀取到一箇舊資料,可能導致快取裡set一箇舊資料,最終導致資料庫和快取資料不一致。
如何解決這種情況下,快取與資料庫資料不一致的問題,是下一章要討論的內容。
相關推薦:
文字很短,希望大家有啟示,幫轉。
相關文章
- 快取架構設計細節二三事--究竟先操作快取,還是資料庫?快取架構資料庫
- 到底是先更新資料庫還是先更新快取?資料庫快取
- 到底應該先操作快取還是先運算元據庫?快取
- 併發環境下,先運算元據庫還是先操作快取?快取
- 快取,究竟是淘汰,還是修改?快取
- 是先做資料庫設計還是先建模資料庫
- Python操作Redis快取資料庫PythonRedis快取資料庫
- DataTable快取資料操作快取
- 分散式系統關注點——先寫DB還是「快取」?分散式快取
- memcached資料庫快取資料庫快取
- 快取資料應放在HTTPSession中,還是在Session Bean?快取HTTPSessionBean
- Redis不僅僅是快取,還是……Redis快取
- 優化MySQL,還是使用快取?優化MySql快取
- 優化MySQL 還是使用快取?優化MySql快取
- 快速搭建Redis快取資料庫Redis快取資料庫
- 資料庫是平替還是改造?資料庫
- 快取淘汰、快取穿透、快取擊穿、快取雪崩、資料庫快取雙寫一致性快取穿透資料庫
- 你管這破玩意叫快取穿透?還是快取擊穿?快取穿透
- Redis快取資料庫-快速入門Redis快取資料庫
- 快取依賴(檔案、資料庫)快取資料庫
- 分散式快取--快取與資料庫一致性方案分散式快取資料庫
- 【轉載】關聯式資料庫還是NoSQL資料庫資料庫SQL
- 程式內快取,究竟怎麼玩?快取
- 聊聊資料庫和快取同步機制資料庫快取
- 記憶體資料庫快取介紹記憶體資料庫快取
- 使用Redis和Java進行資料庫快取 - DZone資料庫RedisJava資料庫快取
- 【Oracle】-【索引】先查資料再建索引,還是先建索引再插資料?Oracle索引
- .net資料快取快取
- java mysql 資料庫備份和還原操作JavaMySql資料庫
- 使用Redis和Java進行資料庫快取RedisJava資料庫快取
- 快取與資料庫一致性快取資料庫
- 資料庫快取管理器塊替換資料庫快取
- nginx快取優先順序Nginx快取
- Redis快取穿透、擊穿、雪崩,資料庫與快取一致性Redis快取穿透資料庫
- 資料庫,邏輯刪還是物理刪?資料庫
- 應用適配資料庫還是資料庫適配應用資料庫
- 檢視某個資料庫在快取中的髒資料資料庫快取
- 分散式快取--快取與資料庫強一致場景下的方案分散式快取資料庫