高併發下快取失效問題

2021-10-19 12:25:58 字數 1600 閱讀 3753

快取穿透

指查詢乙個一定不存在的資料,由於快取是不命中,將去查詢資料庫,但是資料庫也無此記錄,我們沒有將這次查詢的null寫入快取,這將導致這個不存在的資料每次請求都要到儲存層去查詢,失去了快取的意義

風險: 利用不存在的資料進行攻擊,資料庫瞬時壓力增大,最終導致崩潰

解決: null結果快取,並加入短暫過期時間

解決方案

(1)布隆過濾器

可以先有一億個二進位制位元,然後網警用八個不同的隨機數產生器(f1,f2, …,f8) 產生八個資訊指紋(f1, f2, …, f8)。接下來用乙個隨機數產生器 g 把這八個資訊指紋對映到 1 到1億中的八個自然數 g1, g2, …,g8。最後把這八個位置的二進位制全部設定為一。過程如下:

有一天網警查到了乙個可疑的**,想判斷一下是否是xx**,首先將可疑**通過雜湊對映到1億個位元陣列上的8個點。如果8個點的其中有乙個點不為1,則可以判斷該元素一定不存在集合中。

那這個布隆過濾器是如何解決redis中的快取穿透呢?很簡單首先也是對所有可能查詢的引數以hash形式儲存,當使用者想要查詢的時候,使用布隆過濾器發現不在集合中,就直接丟棄,不再對持久層查詢。

這個形式很簡單。

2、快取空物件

當儲存層不命中後,即使返回的空物件也將其快取起來,同時會設定乙個過期時間,之後再訪問這個資料將會從快取中獲取,保護了後端資料來源;

但是這種方法會存在兩個問題:

如果空值能夠被快取起來,這就意味著快取需要更多的空間儲存更多的鍵,因為這當中可能會有很多的空值的鍵;

即使對空值設定了過期時間,還是會存在快取層和儲存層的資料會有一段時間視窗的不一致,這對於需要保持一致性的業務會有影響。

快取雪崩

快取雪崩是指在我們設定快取時key採用了相同的過期時間,導致快取在某一時刻同時失效,請求全部**到db,db瞬時 壓力過重雪崩。

解決: 原有的失效時間基礎上增加乙個隨機值,比如1-5分鐘隨機,這樣每乙個快取的過期時間的重複率就會降低,就很難引發集體失效的事件。

資料預熱:

資料加熱的含義就是在正式部署之前,我先把可能的資料先預先訪問一遍,這樣部分可能大量訪問的資料就會載入到快取中。在即將發生大併發訪問前手動觸發載入快取不同的key,設定不同的過期時間,讓快取失效的時間點盡量均勻。

快取擊穿

對於一些設定了過期時間的key,如果這些key可能會在某些時間點被超高併發地訪問,是一種非常「熱點」的資料。

如果這個key在大量請求同時進來前正好失效,那麼所有對這個key的資料查詢都落到db,我們稱為快取擊穿。

解決: 加鎖。大量併發只讓乙個去查,其他人等待,查到以後釋放鎖,其他人獲取到鎖,先查快取,就會有資料,不用去db

高併發下快取失效問題

1.快取穿透 查詢乙個一定不存在的資料,由於快取一定不命中,將查詢資料庫,並且沒有將null寫入快取,這將導致這個不存在的資料每次請求都到儲存層查詢。風險 利用不存在的資料進行攻擊,資料庫瞬時壓力增大,最終導致崩潰。解決方案 null結果快取,並加入短暫過期時間。2.快取雪崩 指設定快取時key採用...

高併發下快取技術應用

背景 在某些電商促消活動中需要搞活動,對某些頁面的訪問量 qps 往往會非常高。如果直接讀資料庫,肯定db會承受不住。那比較常見的方案就是讓大部分相同資訊的請求都盡可能壓在cache上來緩解db的壓力,從而盡可能去滿足高併發訪問的需求 優化 這種快取技術一般用於不會經常變動資訊,並且訪問次數較多的頁...

高併發下快取穿透 快取雪崩,快取擊穿

併發進來後第乙個請求到達資料庫後,得到的資料並不存在,那麼這時返回null,這個null也會同時存在快取中,然而做快取判斷是,快取中為null就會去資料庫中查詢,那麼這時後面的併發,在來查詢這個不存在的資料是都會進入資料庫 導致資料庫壓力過大,從而導致系統崩潰 快取的key大面積的失效,如100萬的...