您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關(guān)Redis面試常見問答有哪些的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
通常,我們會使用緩存用于緩沖對 DB 的沖擊,如果緩存宕機(jī),所有請求將直接打在 DB,造成 DB 宕機(jī)——從而導(dǎo)致整個系統(tǒng)宕機(jī)。
2 種策略(同時使用):
對緩存做高可用,防止緩存宕機(jī)
使用斷路器,如果緩存宕機(jī),為了防止系統(tǒng)全部宕機(jī),限制部分流量進(jìn)入 DB,保證部分可用,其余的請求返回?cái)嗦菲鞯哪J(rèn)值。
解釋 1:緩存查詢一個沒有的 key,同時數(shù)據(jù)庫也沒有,如果黑客大量的使用這種方式,那么就會導(dǎo)致 DB 宕機(jī)。
解決方案:我們可以使用一個默認(rèn)值來防止,例如,當(dāng)訪問一個不存在的 key,然后再去訪問數(shù)據(jù)庫,還是沒有,那么就在緩存里放一個占位符,下次來的時候,檢查這個占位符,如果發(fā)生時占位符,就不去數(shù)據(jù)庫查詢了,防止 DB 宕機(jī)。
解釋 2:大量請求查詢一個剛剛失效的 key,導(dǎo)致 DB 壓力倍增,可能導(dǎo)致宕機(jī),但實(shí)際上,查詢的都是相同的數(shù)據(jù)。
解決方案:可以在這些請求代碼加上雙重檢查鎖。但是那個階段的請求會變慢。不過總比 DB 宕機(jī)好。
解釋:多個客戶端寫一個 key,如果順序錯了,數(shù)據(jù)就不對了。但是順序我們無法控制。
解決方案:使用分布式鎖,例如 zk,同時加入數(shù)據(jù)的時間戳。同一時刻,只有搶到鎖的客戶端才能寫入,同時,寫入時,比較當(dāng)前數(shù)據(jù)的時間戳和緩存中數(shù)據(jù)的時間戳。
解釋:連續(xù)寫數(shù)據(jù)庫和緩存,但是操作期間,出現(xiàn)并發(fā)了,數(shù)據(jù)不一致了。
通常,更新緩存和數(shù)據(jù)庫有以下幾種順序:
先更新數(shù)據(jù)庫,再更新緩存。
先刪緩存,再更新數(shù)據(jù)庫。
先更新數(shù)據(jù)庫,再刪除緩存。
三種方式的優(yōu)劣來看一下:
先更新數(shù)據(jù)庫,再更新緩存。
這么做的問題是:當(dāng)有 2 個請求同時更新數(shù)據(jù),那么如果不使用分布式鎖,將無法控制最后緩存的值到底是多少。也就是并發(fā)寫的時候有問題。
先刪緩存,再更新數(shù)據(jù)庫。
這么做的問題:如果在刪除緩存后,有客戶端讀數(shù)據(jù),將可能讀到舊數(shù)據(jù),并有可能設(shè)置到緩存中,導(dǎo)致緩存中的數(shù)據(jù)一直是老數(shù)據(jù)。
有 2 種解決方案:
使用“雙刪”,即刪更刪,最后一步的刪除作為異步操作,就是防止有客戶端讀取的時候設(shè)置了舊值。
使用隊(duì)列,當(dāng)這個 key 不存在時,將其放入隊(duì)列,串行執(zhí)行,必須等到更新數(shù)據(jù)庫完畢才能讀取數(shù)據(jù)。
總的來講,比較麻煩。
先更新數(shù)據(jù)庫,再刪除緩存
這個實(shí)際是常用的方案,但是有很多人不知道,這里介紹一下,這個叫 Cache Aside Pattern,老外發(fā)明的。如果先更新數(shù)據(jù)庫,再刪除緩存,那么就會出現(xiàn)更新數(shù)據(jù)庫之前有瞬間數(shù)據(jù)不是很及時。
同時,如果在更新之前,緩存剛好失效了,讀客戶端有可能讀到舊值,然后在寫客戶端刪除結(jié)束后再次設(shè)置了舊值,非常巧合的情況。
有 2 個前提條件:緩存在寫之前的時候失效,同時,在寫客戶度刪除操作結(jié)束后,放置舊數(shù)據(jù) —— 也就是讀比寫慢。設(shè)置有的寫操作還會鎖表。
所以,這個很難出現(xiàn),但是如果出現(xiàn)了怎么辦?使用雙刪?。?!記錄更新期間有沒有客戶端讀數(shù)據(jù)庫,如果有,在更新完數(shù)據(jù)庫之后,執(zhí)行延遲刪除。
還有一種可能,如果執(zhí)行更新數(shù)據(jù)庫,準(zhǔn)備執(zhí)行刪除緩存時,服務(wù)掛了,執(zhí)行刪除失敗怎么辦???
這就坑了?。?!不過可以通過訂閱數(shù)據(jù)庫的 binlog 來刪除。
感謝各位的閱讀!關(guān)于“Redis面試常見問答有哪些”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。