回覆列表
  • 1 # 此生唯一

    簡要說下快取穿透,快取擊穿,快取雪崩的出現情景和解決方案!

    出現上述問題的前提:因為資料庫使用磁碟存取資料,往往比較慢,而快取使用記憶體(而且通常是key-value型),存取較快!

    這樣先使用記憶體快取來快取資料庫資料,讀取資料的時候先從快取讀取,只有獲取不到的時候才從資料庫獲取!

    下面分別從概念,出現場景,解決方案來說:

    ①,快取穿透

    概念:訪問一個不存在的key,所有的讀取都會訪問資料庫,通常資料庫中也沒有這樣的資料,造成穿透,資料量大時,導致資料庫卡死!

    出現情景:一般資料庫都是使用正整數來做id,然後使用id作為key快取,如果有人惡意攻擊,傳一個負數(-100)做大量查詢,那麼資料庫崩潰!

    解決辦法:

    1,設定攔截,對不符合要求的id直接攔截!

    2,快取不存在,資料庫也不存在也進行資料儲存,key-null,並設定過期時間(短點好,1min),這樣能攔截短時間內大量的同一個key的穿透!

    ②,快取擊穿

    概念:快取擊穿通常發生在超高併發的時候,快取中的key超時過期,這時候大量的請求同一時間落到資料庫,造成資料庫卡死!

    出現場景:秒殺活動通常會把商品id等提前進行快取,如果某個正想辭職的程式設計師在設定過期時間的時候,把過期時間設在了秒殺前一刻,那秒殺開始的時候,大量的請求將直接訪問資料庫!

    解決辦法:

    1,熱點資料設定超長的過期時間(甚至forever)

    2,人為干預:在活動開始前先對所有熱點資料進行設定!

    概念:大批次的key過期,導致大量的查詢到了持久層,引起卡死!主要是大量的key,而快取擊穿通常是一個或者少量key!

    出現場景:快取伺服器宕機,程式碼錯誤等導致key大量過期等原因!

    解決方法:

    1,高可用快取叢集,保證快取不掛!

    2,過期時間使用隨機演算法,防止同一時間過期!

    實際應用中,快取雪崩是比較容易碰到的情況,還是尤其需要注意的,最近在持續分享JAVA相關的東西,需要的朋友可以關注。。。

  • 2 # 彼得羅829

    第一,做好監控,及時預警,比如當前有多少存活的值,命中率多少等等,防止抓瞎

    第二,做好主備,防止中介軟體單點故障

    第三,做好快取持久化,為什麼要持久化,是防止中介軟體不可用,直接穿到最底層了。這個持久化並不是說是redis自己的持久化,而是額外的

    第四,就算穿庫,也要保障你的執行效率是高的,不要因為有了快取就忽略了最基礎的部分

  • 中秋節和大豐收的關聯?
  • 當愛情遇到流言蜚語,如何讓感情不變質?