更新時間:2023-03-09 來源:黑馬程序員 瀏覽量:
緩存穿透(Cache Penetration)指的是查詢一個不存在的數(shù)據(jù),由于緩存沒有命中,請求會直接穿透到數(shù)據(jù)庫,導致數(shù)據(jù)庫壓力過大,甚至可能造成宕機。
緩存擊穿(Cache Miss)指的是某一個熱點key在緩存中過期或者被清除,此時大量請求涌入,由于緩存中沒有該key的緩存數(shù)據(jù),請求會直接穿透到數(shù)據(jù)庫,導致數(shù)據(jù)庫壓力過大,甚至可能造成宕機。
緩存雪崩(Cache Avalanche)指的是緩存中大量的數(shù)據(jù)在同一時間過期失效,導致大量的請求涌入數(shù)據(jù)庫,導致數(shù)據(jù)庫壓力過大,甚至可能造成宕機。
以下是針對這三種情況的解決方法:
·在應用程序中添加合適的校驗機制,過濾掉不存在的key,如將所有請求數(shù)據(jù)的唯一標識符(如id)通過一個哈希函數(shù)映射為一個固定的字符串,并判斷字符串是否合法。
·對于查詢結果為空的情況,可以將其緩存到緩存中,但是有效期較短,比如5分鐘,防止惡意攻擊。
·使用互斥鎖或分布式鎖,防止大量請求同時訪問數(shù)據(jù)庫。
·使用熱點數(shù)據(jù)預加載,即在緩存過期之前,提前異步地加載數(shù)據(jù),確保緩存一直有數(shù)據(jù)。
·使用不同的過期時間,避免大量的數(shù)據(jù)在同一時間過期失效。
·使用緩存的異步刷新機制,保證緩存中的數(shù)據(jù)不會同時過期失效。
·使用多級緩存,如本地緩存、分布式緩存和全局緩存,使得緩存的失效不會同時影響所有緩存節(jié)點。