一、先更新資料庫,再更新快取(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...