快取裡面的資料如何和資料庫儲存一致?1.雙寫模式
即更新資料庫的資料後,隨即更新快取裡的資料
產生的問題:
如圖所示,由於網路等原因第乙個更新請求拉頓,而第二個更新請求執行在第乙個請求之前就會出現資料不一致的問題
2.失效模式
即更新資料庫的資料後刪除快取中的資料
產生的問題:
如圖所示,第乙個請求更新資料庫裡的資料,隨後刪除快取。第二個請求也進行更改資料,但此時,第三個請求過來讀取資料;但由於網路等原因第二個請求在進行更改資料庫的資料時有卡頓,所有此時第三個請求讀取的資料是第乙個請求的資料(髒資料);且如果第三個請求的更新操作慢於第二個請求的刪除快取操作時,即第三個請求會把自己讀取的資料(髒資料)更新到快取中
無論是雙寫模式還是失效模式,都會有快取的不一致的問題,即併發情況下同時更新就會有不一致的問題
解決方式:
如果是使用者維度資料(比如訂單資料,使用者資料),這種併發機率小的資料,可以不考慮這方面的問題。可以使用過期時間這一方式,讓資料每一段時間觸發資料的讀的主動更新即可
如果是選單,商品介紹等基礎資料,可以使用canal(阿里開源中介軟體)訂閱binlog的方式
通常情況下,使用快取資料 + 過期時間 就可以解決大部分業務的需求
通過加鎖保證併發讀寫,寫寫的時候按順序排隊(讀寫鎖)
總而言之:
面試 數倉 數倉和資料庫的區別
2者的命名無論中英文其實並無不同,base和warehouse。要從以下幾個方面來區分 拿mysql這個資料庫和apache hive這個資料倉儲為例。這裡hive事實上就是乙個很巨集大的 體系結構 它可以把元資料儲存在mysql oracle或者derby這些具體的資料庫 技術 裡 它在進行查詢時...
刪除資料庫裡記錄數為0的表。 批量刪除表
接了個活,要從原來的資料 庫里導資料。一看300多張表,仔細一看,200多個是一條記錄也沒有的。暈死。下面是如何刪除 得到資料庫中所有表的空間 記錄情況 create table t 表名 sysname,記錄數 int 保留空間 varchar 10 使用空間 varchar 10 索引使用空間 ...
怎麼保證快取和資料庫資料的一致性?
選擇淘汰快取 選擇先淘汰快取,再更新資料庫 原因 假如先更新資料庫,再淘汰快取,假如快取淘汰失敗,那麼後面的請求都會得到髒資料,直至快取過期。假如先淘汰快取再更新資料庫,如果資料庫更新失敗,只會產生一次快取miss,相比較而言,後者對業務影響更小一點。如下場景 同時有乙個請求a進行更新操作,另乙個請...