實際運用場景中,經常遇到高併發,尤其在秒殺、熱點資料,某一時刻產生大量併發請求,如果直接請求資料庫,會造成資料庫癱瘓,造成整個服務不可用,為了避免這種情況發生,經常用到快取技術,來緩衝高併發請求。引入快取技術,能夠緩解資料庫壓力,提供系統效能,系統更加健壯。但是同時快取技術會引發快取穿透、擊穿、雪崩,這些情況需要提前考慮好,做好防護。以redis 為例,講解下如何發生的,該如何處理
某一瞬時大批量請求集中訪問乙個key(上百上千萬請求), 如果此時快取過期失效,快取中資料不存在, 資料庫存在
,所有請求瞬間集中到資料庫,會造成資料庫癱瘓,這就是記憶體擊穿
設定熱點資料永不過期新增互斥鎖:枷鎖之後,保證每乙個key,只有乙個執行緒去執行,其他執行緒等待。
請求的資料在記憶體不存在,去資料庫查詢,查到寫入快取。如果資料庫中也不存在,無法寫入快取,其他請求會繼續去資料庫查詢,這就是快取穿透。總結起來就一話:快取和資料庫都沒有資料
使用布隆過濾器布隆過濾器
某一時刻快取集群失效,如reds 掛了,造成快取雪崩。雪崩後果很嚴重
redis的高可用。 redis可能掛掉,這個時候第一保證高可用。限流降級,快取失效後的處理,(加鎖,返回預定的物件)
資料預熱, 在正式的部署之前,先將這批資料放入到redis快取中,假設即將發生高併發的情況,這個時候設定不同的過期時間。保證部分節點可用
在進行redis資料寫入時引入sync同步**塊(併發寫請求個數=該業務的集群節點數)
(六)redis快取穿透,擊穿,雪崩以及解決方案
專案中業務資料基本上都是存在關係型資料庫中,如 mysql,oracle,sqlserver等資料庫,專案上線初期,由於使用者規模還比較小,系統訪問量不大。關係性資料庫可以抗住併發較小的請求。隨著業務的增長使用者的增加系統整體的併發請求增大。關係型資料庫處理能力跟不上,在對資料庫做主從讀寫分離,分布...
快取穿透,快取擊穿,快取雪崩解決方案方案
設計乙個快取系統,不得不要考慮的問題就是 快取穿透 快取擊穿與失效時的雪崩效應。快取穿透是指查詢乙個一定不存在的資料,由於快取是不命中時被動寫的,並且出於容錯考慮,如果從儲存層查不到資料則不寫入快取,這將導致這個不存在的資料每次請求都要到儲存層去查詢,失去了快取的意義。在流量大時,可能db就掛掉了,...
快取穿透,快取擊穿,快取雪崩解決方案
快取穿透 快取穿透是指查詢乙個一定不存在的資料,由於快取是不命中時被動寫的,並且出於容錯考慮,如果從儲存層查不到資料則不寫入快取,這將導致這個不存在的資料每次請求都要到儲存層去查詢,失去了快取的意義。在流量大時,可能db就掛掉了,要是有人利用不存在的key頻繁攻擊我們的應用,這就是漏洞。解決方案 有...