快取穿透
描述:快取穿透是指快取和資料庫中都沒有的資料,而使用者不斷發起請求,多來自於黑客攻擊。由於快取是不命中時被動寫的,並且出於容錯考慮,如果從儲存層查不到資料則不寫入快取,這將導致這個不存在的資料每次請求都要到儲存層去查詢,失去了快取的意義。
在流量大時,可能db就掛掉了,要是有人利用不存在的key頻繁攻擊我們的應用,這就是漏洞。
如發起為id為「-1」的資料或id為特別大不存在的資料。這時的使用者很可能是攻擊者,攻擊會導致資料庫壓力過大。
解決方案:
介面層增加校驗,如使用者鑑權校驗,id做基礎校驗,id<=0的直接攔截;
從快取取不到的資料,在資料庫中也沒有取到,這時也可以將key-value對寫為key-null,快取有效時間可以設定短點,如30秒(設定太長會導致正常情況也沒法使用)。這樣可以防止攻擊使用者反覆用同乙個id暴力攻擊
快取擊穿
描述:快取擊穿是指快取中沒有但資料庫中有的資料(一般是快取時間到期),這時由於併發使用者特別多,同時讀快取沒讀到資料,又同時去資料庫去取資料,引起資料庫壓力瞬間增大,造成過大壓力。
解決方案
1、設定熱點資料永遠不過期。
2、 介面限流與熔斷,降級。重要的介面一定要做好限流策略,防止使用者惡意刷介面,同時要降級準備,當介面中的某些 服務 不可用時候,進行熔斷,失敗快速返回機制
3、布隆過濾器。bloomfilter就類似於乙個hash set,用於快速判某個元素是否存在於集合中,其典型的應用場景就是快速判斷乙個key是否存在於某容器,不存在就直接返回。布隆過濾器的關鍵就在於hash演算法和容器大小
4、 加互斥鎖,互斥鎖參考**如下:
說明:
1)快取中有資料,直接走上述**13行後就返回結果了
2)快取中沒有資料,第1個進入的執行緒,獲取鎖並從資料庫去取資料,沒釋放鎖之前,其他並行進入的執行緒會等待100ms,再重新去緩訪問資料。這樣就防止都去資料庫重複取資料,重複往快取中更新資料情況出現。
3)當然這是簡化處理,理論上如果能根據key值加鎖就更好了,就是執行緒a從資料庫取key1的資料並不妨礙執行緒b取key2的資料,上面**明顯做不到這點。
快取雪崩:快取雪崩是指快取伺服器宕機或者快取中資料大批量到過期時間,而查詢資料量巨大,引起資料庫壓力過大甚至down機。和快取擊穿不同的是, 快取擊穿指併發查同一條資料,快取雪崩是不同資料都過期了,很多資料都查不到從而查資料庫
解決方案:
1.快取資料的過期時間設定隨機,防止同一時間大量資料過期現象發生。
2.如果快取資料庫是分布式部署,將熱點資料均勻分布在不同得快取資料庫中。
3.設定熱點資料永遠不過期。
4.redis做成高可用redis cluster集群方式,必須要持久化,可以用hystrix限流&降級
快取預熱:
快取預熱這個應該是乙個比較常見的概念,相信很多小夥伴都應該可以很容易的理解,快取預熱就是系統上線後,將相關的快取資料直接載入到快取系統。這樣就可以避免在使用者請求的時候,先查詢資料庫,然後再將資料快取的問題!使用者直接查詢事先被預熱的快取資料!
解決方案:
1、直接寫個快取重新整理頁面,上線時手工操作下;
2、資料量不大,可以在專案啟動的時候自動進行載入;
3、定時重新整理快取;
Redis快取穿透,穿透擊穿,快取雪崩
乙個一定不存在快取及查詢不到的資料,由於快取是不命中時被動寫的,並且出於容錯考慮,如果從儲存層查不到資料則不寫入快取,這將導致這個不存在的資料每次請求都要到儲存層去查詢,失去了快取的意義。有很多種方法可以有效地解決快取穿透問題,最常見的則是採用布隆過濾器,將所有可能存在的資料雜湊到乙個足夠大的bit...
redis 快取穿透 擊穿 雪崩
介面層增加校驗,如使用者鑑權校驗,id做基礎校驗,id 0的直接攔截 從快取取不到的資料,在資料庫中也沒有取到,這時也可以將key value對寫為key null,快取有效時間可以設定短點,如30秒 設定太長會導致正常情況也沒法使用 這樣可以防止攻擊使用者反覆用同乙個id暴力攻擊 public o...
redis 快取雪崩 穿透 擊穿
開源的 高效能的非關係型資料庫。大量的redis快取key同一時間失效,導致大量訪問請求直接打到資料庫,造成資料庫掛掉。解決方案 1.隨機初始化快取失效時間,不要讓大量快取在同一時間失效。2.將熱點key分配到不同的redis節點上。3.設定定時任務,在快取失效時將資料重新刷進去。一般是指redis...