Redis的雪崩與穿透解決方法

2021-10-09 06:42:40 字數 1423 閱讀 8005

原因:快取穿透是指使用者訪問乙個資料庫和redis中不存在的key,如果不對這類請求進行過濾攔截的話,請求每次都會穿過redis直接打到資料庫上,並且我們一般是快取中沒資料的時候去資料庫中取,取出來之後再放到快取中,但這類請求所需要的資料在資料庫中也不存在,所以即使請求打到資料庫上,最終快取中還是沒有資料,在這類請求高併發的情況下,資料庫很快就會被拖垮,引起服務異常。

解決方法:

1.api閘道器

2.限定ip的訪問次數.

3.快取空值

之所以會發生穿透,就是因為快取中沒有儲存這些空資料的key。從而導致每次查詢都到資料庫去了。那麼我們就可以為這些key對應的值設定為null 丟到快取裡面去。後面再出現查詢這個key 的請求的時候,直接返回null 。

4.布隆過濾器

布隆過濾器:

本質上布隆過濾器是一種資料結構,比較巧妙的概率型資料結構(probabilistic data structure),特點是高效地插入和查詢,可以用來告訴你 「某樣東西一定不存在或者可能存在」。

相比於傳統的 list、set、map 等資料結構,它更高效、占用空間更少,但是缺點是其返回的結果是概率性的,而不是確切的。

我們可以在做事務型處理之後,將需要快取的key放到布隆過濾器中,但是由於布隆過濾器只能保證可能存在,所以在使用過程中還是會有穿透的可能性存在,但概率極小.

原因:大量的key在同一時刻同時失效,這些key並不一定是設定了相同的時間,也可能是湊巧時間累計在一起了,恰巧大量的針對這些失效的key的請求在同一時間大量的打了進來,這時快取全部未命中,所有的請求都透傳到資料庫上,引起資料庫壓力瞬間擴大數倍,極易導致資料庫因負載過高而崩潰,危害極大。

解決方法:**原因:**快取雪崩是說的大量的key,快取擊穿說的是某乙個熱點key,也就是在某些時間點會被超高的併發訪問。key在某個時間點過期的時候,恰好在對這個key有大量的併發請求過來,快取中無法命中則會把請求全部打到資料庫,如此大量的請求可能會瞬間把資料庫壓爆。

解決方法:

1.讓業務查詢多個redis,並且保證資料不再同一時間失效即可.

2.同步鎖:對於熱點key,set快取的時候同時set乙個針對這個key的監視key,監視key的過期時間一定要小於被監視的key,每次獲取快取資料的時候都獲取一下這個監視key,並判斷監視key是否過期了,如果過期了,則重置一下key的過期時間,並重新設定這個監視key

3.臨時加鎖:對key加上互斥鎖,若快取中命中不了的時候,先給這個key設定乙個鎖(setnx),鎖的過期時間要非常簡短,只有加鎖成功的執行緒才透傳到db,載入完資料後set到快取中,並釋放鎖

redis雪崩,穿透,擊穿以及解決方法

一瞬間有大量的訪問只是資料庫崩了,比如12點重新整理快取,在重新整理快取的同時有大量的請求訪問,由於快取中沒有資料,知己查詢資料庫知識服務宕機 解決 往redis中存入快取的時候每個key設定失效時間的時候加乙個隨機數,使其不再同一時間大批量的重新整理快取 如在集群中部署熱點資料均勻分布,或者設定熱...

Redis快取雪崩和穿透的解決方法

如何解決快取雪崩?如何解決快取穿透?如何保證快取與資料庫雙寫時一致的問題?1.1什麼是快取雪崩?回顧一下我們為什麼要用快取 redis 現在有個問題,如果我們的快取掛掉了,這意味著我們的全部請求都跑去資料庫了。在前面學習我們都知道redis不可能把所有的資料都快取起來 記憶體昂貴且有限 所以redi...

Redis穿透與雪崩

查詢的邏輯邏如下圖所示。1 查詢redis,資料存在直接返回。2 如資料不存在則查資料庫,然後存入快取然後再返回。如果,查的資料在redis不存在。redis將去掃整個redis庫,最後沒找到這條資料返回空。這個過程叫做redis穿透。那麼redis穿透有什麼問題?1 redis穿透查詢的耗時更久。...