Redis與Mysql怎麼樣保證一致性

2021-10-01 02:26:39 字數 798 閱讀 1119

一、先更新資料庫,再更新快取(pass)

存在的問題:

//執行緒安全角度

a更新了資料庫

b更新了資料庫

因為網路的原因執行緒b先更新了快取

a更新了快取

//業務場景角度

寫多讀少的場景:根本沒去操作讀資料,而快取就被頻繁的更新,浪費效能。

二、先刪除快取,再更新資料庫

場景a進行寫操作,刪除快取

b發現快取中沒有,而直接讀資料庫,查到的舊值

b將舊值寫入快取

a將新值寫入了資料庫

存在的問題:a修改後的新值沒有寫入到快取中。

處理方式:延時雙刪策略(先刪除快取,再更新資料庫,然後休息ms,然後再刪除快取),最後一步可以做成非同步(需要考慮失敗的情況)。

三、先更新資料庫,再刪除快取

步驟:  失效-命中-快取

失效:應用程式先從cache取資料,沒有得到,則從資料庫中取資料,成功後,放到快取中

命中:應用程式從cache中取資料,取到後返回

快取:先把資料存到資料庫中,成功後,再讓快取失效

場景:請求a做讀操作,b做寫操作

a做讀操作的時候快取剛好失效,得到乙個舊值

請求b將新值寫入資料庫

請求b刪除快取

請求a將查到的舊值寫入快取

//這種場景下會發生髒資料,但是發生的概率很低。發生的先天條件是寫的步驟比讀更快,才有可能導致4/5問題的發生。

處理的方式:延時刪除保證讀完成後再進行刪。

需要考慮(當出現寫入資料庫成功,但是刪快取失敗了的異常處理),可以採用訊息佇列來處理

mysql怎麼樣建儲存過程

怎麼樣建乙個帶輸入引數的儲存過程,哪位可以給乙個例子的 還有在mysql中建表的時候 比如說 create table customer id int auto increment primary key not null,name varchar 20 not null,age int not n...

怎麼樣用Redis輕鬆實現秒殺系統

導論 秒殺系統,是典型的短時大量突發訪問類問題。對這類問題,有三種優化效能的思路 寫入記憶體而不是寫入硬碟 非同步處理而不是同步處理 分布式處理 用上這三招,不論秒殺時負載多大,都能輕鬆應對。更好的是,redis能夠滿足上述三點。因此,用redis就能輕鬆實現秒殺系統。用我這個方案,無論是電商平台 ...

怎麼樣裝mysql 如何安裝MySQL資料庫

如何安裝mysql資料庫 一 安裝yum repo 2 然後進行repo的安裝 rpm ivh mysql57 community release el7 9.noarch.rpm 執行完成後會在 etc yum.repos.d 目錄下生成兩個repo檔案mysql community.repo m...