1. 程式人生 > 資料庫 >簡述redis的擊穿、穿透和雪崩

簡述redis的擊穿、穿透和雪崩

擊穿、穿透和雪崩都是在redis作為快取時發生的。

當redis作為快取的時候,key是會過期,可能是因為到了過期時間,或者因為LRU/LFU。

==============================================================================================

擊穿:

產生原因:由於key過期了,造成了併發的訪問資料庫,這種現象叫做擊穿。這種併發必須是高併發。

解決思路:目的是阻止併發到達DB,當請求發現key過期了,就去呼叫方法setnx(),呼叫這個方法相當於搶鎖的過程。首先redis是單程序單例項的,所以這麼多的併發,肯定有第一個請求發現key過期了,那第一個請求就去呼叫setnx()方法建立一個key,由於第一個請求呼叫了這個方法,相當於搶到了鎖,其他的請求隨機的睡一會,再getkey。搶到鎖的請求建立key,然後訪問資料庫給Key賦值。方法結束後,其他請求發現這個key有值了,就可以拿到值了。

致命問題:提到鎖,就會有一個致命的問題--死鎖。

                 問題1:如果第一個請求在請求資料庫的途中掛了,這樣會造成死鎖。

                 解決辦法:設定鎖的失效時間。

                 問題2:第一個請求沒掛,但是鎖超時了,此時第一個請求阻塞在資料庫請求中,但是鎖被釋放了,會有第二個請求來搶鎖,第二個拿到鎖的,還會阻塞到資料庫請求中。

                 解決辦法:使用多執行緒,當第一個請求去資料庫請求資料的時,建立一個執行緒去監視這個請求的執行緒,根據監控第一個請求的狀態來適當的延遲鎖的失效時間。

穿透:

產生原因:當業務接收的查詢是系統根本不存在的資料,請求會直接穿過redis,到達DB。

解決思路:使用布隆過濾器,具體有如下三種方法。

       1.客戶端儲存所有的布隆演算法和資料:請求不存在的資料時,客戶端過濾請求,不會到達redis。

       2.客戶端只包含演算法,布隆過濾器的bitMap放入redis,此時所有的服務都處於無狀態。

       3.redis中整合一個布隆的模組。

缺點:布隆過濾器只能增加,不能刪除。如果資料存在大量的增刪改情況,可以考慮換一個過濾器,或者做一個null的key。

雪崩:

產生原因:當redis中大量的key同時失效,間接造成了大量的訪問到達DB。

解決思路:有如下兩個方向

      1.必須指定時間過期:有時候資料到了指定的時間必須過期,比如今天蘋果的價格是3塊錢,明天的蘋果就是2.5塊錢,0點的時候redis中的資料全要更新,這樣容易造成雪崩。

               解決辦法:a.強依賴擊穿方案。

                                 b.業務層加判斷,在0點的時候,做一個延遲。保證同一時間,不會有過多請求打到redis上。

      2.與時點性無關:隨機指定過期時間。

 

這是redis面試中比較高頻出現的詞彙,簡單講解一下。