搞懂 Redis 緩存穿透、擊穿、雪崩!
來自:碼農(nóng)每日一題?|?責(zé)編:樂樂
??? ?
? ?正文? ?
如何有效的理解并且區(qū)分 Reids 穿透、擊穿和雪崩之間的區(qū)別,一直以來都挺困擾我的。特別是穿透和擊穿,過一段時(shí)間就稀里糊涂的分不清了。
為了有效的幫助筆者自己,以及擁有同樣煩惱的朋友們區(qū)分這三種場景。筆者總結(jié)了一些關(guān)鍵詞,希望大家可以和我一樣通過聯(lián)想的方式來區(qū)分并理解這三種場景的區(qū)別!
緩存穿透
當(dāng) Redis 和數(shù)據(jù)庫中都沒有我們想要的數(shù)據(jù)時(shí),就需要考慮緩存穿透的問題了。下面這段邏輯大家用的會比較多:先去 Redis 中查找某資源,Redis 中查不到就去 DB 中查,DB 中查到后回寫一份數(shù)據(jù)到 Redis 中。

這段邏輯正常情況下問題并不大,但是如果用戶惡意重復(fù)請求資源 X,該資源在 Redis 和 DB 中都不存在。那么每次請求都會直接打到 DB 上,甚至導(dǎo)致物理 DB 宕機(jī)。
如果系統(tǒng)發(fā)現(xiàn) Redis 及 DB 中都不存在該資源,就緩存空結(jié)果一段時(shí)間。需要注意哈,這次的失效時(shí)間不能設(shè)置的太長,否則數(shù)據(jù)的實(shí)效性會產(chǎn)生很大的問題。
對用戶的請求合法性進(jìn)行校驗(yàn),攔截惡意重復(fù)請求。
看到這個(gè)名詞不要慌。簡單來說布隆過濾器的用途就是幫助你判斷某個(gè)值是否存在。舉個(gè)例子來看下:假設(shè)我們現(xiàn)在有一個(gè)長度為 9 的 bit 數(shù)組,該數(shù)組的每個(gè)位置上只能保存 1 或者 0,1 標(biāo)識該位置被占用,0 標(biāo)識該位置未被使用。
對于 key1,我們借助三個(gè) Hash 函數(shù)分別對其哈希運(yùn)算。 再將得到的這三個(gè)哈希值對 9 求模。 最后將這三個(gè)模值落入到 bit 數(shù)組上。 key2、key3 按照同樣的方式再處理一遍。


最后,我們會發(fā)現(xiàn)這個(gè) bit 數(shù)組里只有位置 3 還是空著的。如果此時(shí)來了一個(gè)新的 key4 通過三個(gè)Hash算法求出的哈希值為 1、2、3,我們則可以斷定 key4 一定不存在。
在公眾號程序員小樂后臺回復(fù)“Java”,獲取一份Java面試題和答案驚喜禮包。

布隆過濾器的原理還是比較簡單的。這里我們需要注意,布隆過濾器可能存在一定誤判的可能性,但它依然可以幫助你攔截掉大部分一定不存在的數(shù)據(jù)。
緩存擊穿
試想如果所有請求對著一個(gè) key 照死里搞,這是不是就是一種定點(diǎn)打擊呢?
怎么理解呢?舉個(gè)極端的例子:比如某某明星爆出一個(gè)驚天狠料,海量吃瓜群眾同時(shí)訪問微博去查看該八卦新聞,而微博 Redis 集群中數(shù)據(jù)在此刻正好過期了,那么無數(shù)的請求則直接打到了微博系統(tǒng)的物理 DB 上,DB 瞬間掛了。
比如我們可以將某個(gè) key 的緩存時(shí)間設(shè)置為 25 小時(shí),然后后臺有個(gè) JOB 每隔 24 小時(shí)就去批量刷新一下熱點(diǎn)數(shù)據(jù)。就可以解決這個(gè)問題了。
容易影響吞吐量,大部分項(xiàng)目設(shè)置熱點(diǎn) key 永不過期就妥妥的了。
緩存雪崩
這里的 Redis 崩了指的并不是 Redis 集群宕機(jī)了。而是說在某個(gè)時(shí)刻 Redis 集群中的熱點(diǎn) key 都失效了。如果集群中的熱點(diǎn) key 在某一時(shí)刻同時(shí)失效了的話,試想海量的請求都將直接打到 DB 上,DB 可能在瞬間就被打爆了。
Redis 失效時(shí)間加上隨機(jī)數(shù),是一種比較取巧的解決方案。在一定程度上減輕了 DB 的瞬時(shí)壓力,但是這種方案也在一定程度上增加了維護(hù)的成本。
實(shí)現(xiàn)方案在上文中簡單提過了。
總結(jié)
最后我們再回歸到主題!如何輕松的通過聯(lián)想的方式來區(qū)分 Redis 緩存穿透、擊穿、雪崩的區(qū)別?
緩存穿透---穿過(繞過) Redis 和 DB 來搞你 緩存擊穿---定點(diǎn)打擊來搞你 緩存雪崩---熱點(diǎn) key 在某一個(gè)時(shí)刻同時(shí)失效
PS:歡迎在留言區(qū)留下你的觀點(diǎn),一起討論提高。如果今天的文章讓你有新的啟發(fā),歡迎轉(zhuǎn)發(fā)分享給更多人。
推薦閱讀:
最近面試BAT,整理一份面試資料《Java面試BAT通關(guān)手冊》,覆蓋了Java核心技術(shù)、JVM、Java并發(fā)、SSM、微服務(wù)、數(shù)據(jù)庫、數(shù)據(jù)結(jié)構(gòu)等等。
獲取方式:點(diǎn)“在看”,關(guān)注公眾號并回復(fù)?666?領(lǐng)取,更多內(nèi)容陸續(xù)奉上。
明天見(??ω??)??
