<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          搞懂 Redis 緩存穿透、擊穿、雪崩!

          共 2033字,需瀏覽 5分鐘

           ·

          2020-12-30 17:01

          :碼農(nóng)每日一題?|?責(zé)編:樂樂

          ??? ?

          ? ?正文? ?


          如何有效的理解并且區(qū)分 Reids 穿透、擊穿和雪崩之間的區(qū)別,一直以來都挺困擾我的。特別是穿透和擊穿,過一段時(shí)間就稀里糊涂的分不清了。

          為了有效的幫助筆者自己,以及擁有同樣煩惱的朋友們區(qū)分這三種場景。筆者總結(jié)了一些關(guān)鍵詞,希望大家可以和我一樣通過聯(lián)想的方式來區(qū)分并理解這三種場景的區(qū)別!


          緩存穿透

          關(guān)鍵詞:穿過 Redis 和數(shù)據(jù)庫

          當(dāng) Redis 和數(shù)據(jù)庫中都沒有我們想要的數(shù)據(jù)時(shí),就需要考慮緩存穿透的問題了。下面這段邏輯大家用的會比較多:先去 Redis 中查找某資源,Redis 中查不到就去 DB 中查,DB 中查到后回寫一份數(shù)據(jù)到 Redis 中。

          這段邏輯正常情況下問題并不大,但是如果用戶惡意重復(fù)請求資源 X,該資源在 Redis 和 DB 中都不存在。那么每次請求都會直接打到 DB 上,甚至導(dǎo)致物理 DB 宕機(jī)。

          解決方案:
          1、緩存空結(jié)果

          如果系統(tǒng)發(fā)現(xiàn) Redis 及 DB 中都不存在該資源,就緩存空結(jié)果一段時(shí)間。需要注意哈,這次的失效時(shí)間不能設(shè)置的太長,否則數(shù)據(jù)的實(shí)效性會產(chǎn)生很大的問題。

          2、用戶合法性校驗(yàn)

          對用戶的請求合法性進(jìn)行校驗(yàn),攔截惡意重復(fù)請求。

          3、布隆過濾器

          看到這個(gè)名詞不要慌。簡單來說布隆過濾器的用途就是幫助你判斷某個(gè)值是否存在。舉個(gè)例子來看下:假設(shè)我們現(xiàn)在有一個(gè)長度為 9 的 bit 數(shù)組,該數(shù)組的每個(gè)位置上只能保存 1 或者 0,1 標(biāo)識該位置被占用,0 標(biāo)識該位置未被使用。

          1. 對于 key1,我們借助三個(gè) Hash 函數(shù)分別對其哈希運(yùn)算。
          2. 再將得到的這三個(gè)哈希值對 9 求模。
          3. 最后將這三個(gè)模值落入到 bit 數(shù)組上。
          4. key2、key3 按照同樣的方式再處理一遍。

          最后,我們會發(fā)現(xiàn)這個(gè) bit 數(shù)組里只有位置 3 還是空著的。如果此時(shí)來了一個(gè)新的 key4 通過三個(gè)Hash算法求出的哈希值為 1、2、3,我們則可以斷定 key4 一定不存在。

          在公眾號程序員小樂后臺回復(fù)“Java”,獲取一份Java面試題和答案驚喜禮包。

          布隆過濾器的原理還是比較簡單的。這里我們需要注意,布隆過濾器可能存在一定誤判的可能性,但它依然可以幫助你攔截掉大部分一定不存在的數(shù)據(jù)。


          緩存擊穿

          關(guān)鍵詞:定點(diǎn)打擊

          試想如果所有請求對著一個(gè) key 照死里搞,這是不是就是一種定點(diǎn)打擊呢?

          怎么理解呢?舉個(gè)極端的例子:比如某某明星爆出一個(gè)驚天狠料,海量吃瓜群眾同時(shí)訪問微博去查看該八卦新聞,而微博 Redis 集群中數(shù)據(jù)在此刻正好過期了,那么無數(shù)的請求則直接打到了微博系統(tǒng)的物理 DB 上,DB 瞬間掛了。

          解決方案:
          1、熱點(diǎn)數(shù)據(jù)永遠(yuǎn)不過期

          比如我們可以將某個(gè) key 的緩存時(shí)間設(shè)置為 25 小時(shí),然后后臺有個(gè) JOB 每隔 24 小時(shí)就去批量刷新一下熱點(diǎn)數(shù)據(jù)。就可以解決這個(gè)問題了。

          2、使用互斥鎖

          容易影響吞吐量,大部分項(xiàng)目設(shè)置熱點(diǎn) key 永不過期就妥妥的了。


          緩存雪崩

          關(guān)鍵詞:Redis 崩了,沒有數(shù)據(jù)了

          這里的 Redis 崩了指的并不是 Redis 集群宕機(jī)了。而是說在某個(gè)時(shí)刻 Redis 集群中的熱點(diǎn) key 都失效了。如果集群中的熱點(diǎn) key 在某一時(shí)刻同時(shí)失效了的話,試想海量的請求都將直接打到 DB 上,DB 可能在瞬間就被打爆了。

          解決方案:
          1、Redis 失效時(shí)間加上隨機(jī)數(shù)

          Redis 失效時(shí)間加上隨機(jī)數(shù),是一種比較取巧的解決方案。在一定程度上減輕了 DB 的瞬時(shí)壓力,但是這種方案也在一定程度上增加了維護(hù)的成本。

          2、Redis 永不過期

          實(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ā)分享給更多人。

          —————END—————


          推薦閱讀:



          最近面試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ù)奉上。

          明天見(??ω??)??
          瀏覽 73
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  色亭亭 | 中文国产字幕 | 影音先锋一区二区成人三级视频 | 亚洲色婷婷五月 | 人人妻人人躁人人DVD |