前台請求,後台先從快取中取資料,取到直接返回結果,取不到時從資料庫中取,資料庫取到更新快取,並返回結果,資料庫也沒取到,那直接返回空結果。
描述:
快取穿透是指快取和資料庫中都沒有的資料,而使用者不斷發起請求,如發起為id為「-1」的資料或id為特別大不存在的資料。這時的使用者很可能是攻擊者,攻擊會導致資料庫壓力過大。
解決方案:
介面層增加校驗,如使用者鑑權校驗,id做基礎校驗,id<=0的直接攔截;
從快取取不到的資料,在資料庫中也沒有取到,這時也可以將空值快取到redis,快取有效時間可以設定短點(有值的資料按照正常情況快取,只是多個判斷),如30秒或者5分鐘、10分鐘(設定太長會導致正常情況也沒法使用)。這樣可以防止攻擊使用者反覆用同乙個id暴力攻擊
使用布隆過濾器,布隆過濾器雖不能確定某些key一定存在,但能確定某些key一定不存在,在很大程度上可以過濾掉不存在的key。
描述:
快取擊穿是指快取中沒有但資料庫中有的資料(一般是快取時間到期),這時由於併發使用者特別多,同時讀快取沒讀到資料,又同時去資料庫去取資料,引起資料庫壓力瞬間增大,造成過大壓力
解決方案:
設定熱點資料永遠不過期(等到這些資料沒用的時候,人為主動清除這些快取)。
說明:1)快取中有資料,直接走上述**13行後就返回結果了
2)快取中沒有資料,第1個進入的執行緒,獲取鎖並從資料庫去取資料,沒釋放鎖之前,其他並行進入的執行緒會等待100ms,再重新去緩訪問資料。這樣就防止都去資料庫重複取資料,重複往快取中更新資料情況出現。
3)當然這是簡化處理,理論上如果能根據key值加鎖就更好了,就是執行緒a從資料庫取key1的資料並不妨礙執行緒b取key2的資料,上面**明顯做不到這點。
描述:
快取雪崩是指快取中大批量資料在同一時刻(相差很短的時間,如3秒、2秒也可以理解為同一時刻)到過期時間,而查詢資料的請求量巨大,引起資料庫壓力過大甚至down機。和快取擊穿不同的是,快取擊穿指併發查同一條資料,快取雪崩是不同資料都過期了,很多資料都查不到從而查資料庫。
解決方案:
快取資料的過期時間設定隨機,防止同一時間大量資料過期現象發生。
如果快取資料庫是分布式部署,將熱點資料均勻分布在不同搞得快取資料庫中。
設定熱點資料永遠不過期。
Redis 快取穿透 快取擊穿 快取雪崩
快取穿透是指快取和資料庫中都沒有的資料,而使用者不斷發起請求,如發起為id為小於0的資料或id為特別大等不存在的資料。這時的使用者很可能是攻擊者,攻擊會導致資料庫壓力過大。舉例 通過分類id查詢廣告集合 param categoryid 廣告分類id return 廣告集合 public listf...
Redis快取穿透 快取擊穿 快取雪崩
4 總結 一般企業都會用到mysql等關係型資料庫,當訪問量不大的時候還可以支撐 當併發量高的時候,比如商品搶購或者主頁訪問瞬間較大的時候,請求直接到達db,可能會導致系統效能急劇下降以致癱瘓。db是面向磁碟的,磁碟io是比較重的操作,效能較低。為了克服上述的問題,通常需要在客戶端和db之間引入一層...
Redis快取穿透 快取擊穿 快取雪崩
指的是,redis快取中和資料庫中都沒有的資料,使用者不斷向伺服器發起請求,導致資料庫壓力過大。一般的流程查詢流程存在redis快取穿透bug 沒獲取到資料,到資料庫中查詢 如果一直沒獲取和查詢到資料,使用者不斷發起請求,資料庫就會不斷地進行查詢操作,導致資料庫壓力增大,導致快取擊穿。解決方案 阻止...