快取之快取擊穿 穿透 雪崩

2021-10-09 04:35:17 字數 1226 閱讀 9351

redis高頻面試題

快取穿透

概念

有乙個查詢介面,頻繁接受到資料庫中並不存在的查詢條件,每次根據key查詢快取中都查不到,則這些查詢請求紛紛落到資料庫上,請求量大,造成資料庫頻繁io最終宕機。例如介面是根據id獲取使用者,查詢引數為-1、-2這種資料庫根本沒有的資料。

解決方案

1. 在redis中快取不存在的查詢結果。

每當介面被請求時,如果資料庫返回為空,則依舊往redis裡根據查詢的key寫入快取,這樣下次再來同樣的請求則可以直接走緩訪問資料

問題

當頻繁呼叫介面查資料這個操作是黑客在弄時,就會發現這種情況。每次調介面所使用的請求引數都不相同,這樣就會造成redis中有大量的無效key儲存的空資料,極大浪費空間。

2. 布隆過濾器

布隆過濾器可以簡單高效地解決快取穿透問題。布隆過濾器可以實現將資料庫中存在的鍵都放置進去,這樣在查詢請求過來時,先走布隆過濾器,布隆過濾器會返回這個key是一定不存在或者可能存在,如果判定結果是一定不存在,則直接返回即可,不需要再走快取和資料庫;如果是可能存在,則繼續走快取-資料庫。

快取擊穿

概念

某一熱點資料,在redis快取的資料超期導致快取失效,同一時間很多請求同時請求,因快取中沒有查詢到資料,則這些請求直接全部落到資料庫,造成資料庫壓力過大。

解決方案

1. redis某些持久的熱點資料的過期時間設定為永遠

2. 在熱點快取資料即將過期前進行續約

目前能想到的做法是在快取完資料後扔到mq佇列中,ttl設定的比快取過期時間少一點,這個佇列並不設定消費者。在此訊息的ttl過期後進入死信佇列,死信佇列的消費者(即續約方法)去續約redis的熱點資料。

3. 互斥鎖

在快取資料失效後,往redis裡寫資料的方法加鎖,在更新完redis後其它方法可直接從redis裡獲取熱點資料並返回。但這樣做可能導致大批請求等鎖的情況,並不合適。

快取雪崩

概念

redi服務因為各種原因宕機,快取層失效,導致請求全部打到資料庫上。

解決方案

1. 雪崩前:搭建redis集群實現redis的高可用

雪崩中:實現服務的熔斷、降級

雪崩後:redis選擇性做持久化,在重啟後直接載入持久化資料

快取雪崩 擊穿 穿透

1 快取雪崩 是指在某乙個時間段,快取集中過期失效,或者是快取宕機,所有請求全部打到db上。應對辦法 分散快取過期時間,具體做法是分別設定不同的快取時間,比如加上隨機因子。2 快取擊穿 當某個熱點key失效時,高併發直接請求資料庫對資料庫伺服器造成壓垮性的壓力,比如爆款商品。應對辦法 1 熱點資料永...

快取雪崩 擊穿 穿透

快取擊穿 快取穿透 在同一時間快取資料集體失效,此時大量請求訪問失效資料,導致大量併發直接訪問資料庫造成資料庫壓力 將需要快取的資料進行分散失效處理,將快取的資料的失效時間設定乙個隨機值,避免大量快取資料在同一時間集體失效 將部分經常做查詢且不經常更新的資料的快取時間設定為永不失效 對於統一個key...

redis 快取擊穿 穿透 雪崩

一般的快取系統,都是按照key去快取查詢,如果不存在對應的value,就去後端系統查詢 比如db 一些惡意的請求會故意查詢不存在的key,請求量很大,就會對後端系統造成很大的壓力。這就叫做快取穿透。如何避免?1 對查詢結果為空的情況也進行快取,這樣,再次訪問時,快取層會直接返回空值。快取時間設定短一...