redis快取問題筆記

2021-10-24 17:07:07 字數 1214 閱讀 2573

一.快取雪崩

大量的key同時失效,導致所有的客戶端請求都需要經過資料庫的查詢才能得到返回結果,導致資料庫壓力過大而系統崩潰。

解決方法:

1.不要讓快取同時失效,在設定快取的過期時間時,隨機初始化快取的失效時間

2.如果redis是集群的模式,可以讓熱點的key部署到不同的redis伺服器上,這樣子就不會同時失效

3.設定key永遠不失效

4.通過定時任務的模式來不斷重新整理快取的失效時間。

二.快取穿透

客戶端的請求沒有經過快取直接訪問資料庫,例如,資料庫裡的自增id是從0開始的正整數,那麼快取在reids裡的資料,是沒有負數的,黑客就會利用一些負數來進行請求,這些請求就會不經過快取直接訪問到資料庫,導致資料庫壓力過大而系統崩潰。

1.布隆過濾器

2.引數合法性校驗

3.封掉ip(惡意使用者可能會換ip)

4.把所有請求引數的結果查出來之後再次存到快取裡(惡意使用者可能會再換其他引數)

三.快取擊穿

乙個熱點的key突然失效了,導致所有的客戶端請求訪問資料庫,導致資料庫壓力太大而造成系統崩潰

1.快取永遠不失效

2.分布式應用使用分布式鎖,單體使用互斥鎖

具體的做法是:在key失效,然後訪問資料庫的時候加上互斥鎖,只有乙個執行緒可以訪問到資料庫,然後請求得到資料之後再次設定快取,然後其他請求都通過快取得到結果。而其他沒有搶到鎖的執行緒可以讓它睡一會再從快取中取得結果。

額外:布隆過濾器:乙個二進位制的陣列。只有增刪查操作。刪的話很麻煩,沒容易會刪除其他資料。查詢的速度是非常的快。因為他是基於陣列的乙個操作,通過hash函式進行計算得到陣列的下標,是進行隨機訪問的。即可以用過下標直接訪問。時間複雜度為o(k),k是hash函式的個數。

優點:占用空間小(二進位制資料),訪問速度快(hash函式,陣列),安全性好(不存原始資料,只存二進位制0和1)

缺點:比較難做這個刪除的操作,如果多個資料的hash函式計算出來的結果都是同乙個下標,那麼刪除的時候就會造成歧義。誤判,主要是因為不同的資料計算出來的hash值可能是相同的,所以也會造成一些判斷資料是否存在的結果是不正確的。誤判不能避免,只能減少出現誤判的概率。可以通過布隆過濾器的建構函式來設定誤判率從而影響誤判出現的機率。但是這個誤判率會影響效能,誤判率設定得越小,那麼得出結果所需要的時間就更加的長(誤差率越小,hash函式越多)。

為什麼需要多個hash函式計算?因為如果只有乙個hash函式的話,計算出來的結果相同的概率非常大,這樣子誤判率就會非常高。

Redis 快取問題

描述 查詢乙個資料庫中不存在的資料,比如商品詳情,查詢乙個不存在的id,每次都會訪問db,如果有人惡意破壞,很可能直接對db造成過大地壓力。解決方案 當通過某乙個key去查詢資料的時候,如果對應在資料庫中的資料都不存在,我們將此key對應的value設定為乙個預設的值,比如 null 並設定乙個快取...

Redis快取問題

快取雪崩就是 redis 的大量熱點資料在短時間內同時過期 失效 因為設定了相同的過期時間,剛好這個時候 redis 請求的併發量又很大,就會導致所有的請求到資料庫。快取雪崩解決方案 1.加互斥鎖或者使用佇列,針對同乙個key只允許乙個執行緒到資料庫查詢 2.快取定時預先更新,避免同時失效 3.通過...

Redis快取問題

1.快取雪崩 快取雪崩是指快取同一時間大面積的失效,所以後面的請求都會落到資料庫上,造成資料庫短時間內承受大量請求而崩掉。解決方案 快取資料過期時間隨機設定,防止同一時間大量資料過期現象發生。併發量不是特別多的時候,加鎖排隊。給每乙個快取資料新增乙個標價,記錄快取是否失效,如果失效,則更新資料快取。...