穿透:
是指查詢乙個資料庫一定不存在的資料。正常的使用快取流程大致是,資料查詢先進行快取查詢,如果key不存在或者key已經過期,再對資料庫進行查詢,並把查詢到的物件,放進快取。如果資料庫查詢物件為空,則不放進快取。而每次查詢都是空,每次又都不會進行快取。假如有惡意攻擊,就可以利用這個漏洞,對資料庫造成壓力,甚至壓垮資料庫。即便是採用uuid,也是很容易找到乙個不存在的key,進行攻擊。如果從資料庫查詢的物件為空,也放入快取,只是設定的快取過期時間較短,比如設定為60秒。
發生場景:
redis伺服器重啟或者大量的快取在同一時期失效,此時大量的流量會全部衝擊到資料庫上面,資料庫有可能因為承受不住而宕機
解決辦法:
採用快取空值的方式,也就是從資料庫查詢的物件為空,也放入快取,只是設定的快取過期時間較短,比如設定為60秒。
雪崩:是指在某乙個時間段,快取集中過期失效。
比較集中的放入了快取,假設快取乙個小時。
於資料庫而言,就會產生週期性的壓力波峰。
過期時間,而且,熱門類目的商品快取時間長一些,冷門類目的商品快取時間短一些,也能節省快取服務的資
源。發生場景:當redis伺服器重啟或者大量快取在同一時期失效時,此時大量的流量會全部衝擊到資料庫上面,資料庫有可能會因為承受不住而宕機
解決辦法:
1)隨機均勻設定失效時間
2)設定過期標誌更新快取
3)併發量不是特別多的時候,使用最多的解決方案是加鎖排隊
快取擊穿,是指乙個key非常熱點,在不停的扛著大併發,大併發集中對這乙個點進行訪問,當這個key在失效
的瞬間,持續的大併發就穿破快取,直接請求資料庫,就像在乙個屏障上鑿開了乙個洞。
其實,大多數情況下這種爆款很難對資料庫伺服器造成壓垮性的壓力。達到這個級別的公司沒有幾家的。所
以,務實主義的小編,
對主打商品都是早早的做好了準備,讓快取永不過期。即便某些商品自己發酵成了爆款,也是直接設為永不過
期就好了。
是一種機制,怎麼樣保證快取中的key是實時有效的,以及及時的更新資料資源
解決辦法:
1)快取伺服器自帶的快取失效策略
2)自定義:定時去清理過期的快取;當使用者請求過來時,再判斷這個請求所用到的快取是否過期,過期的話就去底層系統得到新資料並更新快取。
發生場景:當訪問量劇增、服務出現問題(如響應時間慢或不響應)或非核心服務影響到核心流程的效能時,仍然需要保證服務還是可用的,即使是有損服務。系統可以根據一些關鍵資料進行自動降級,也可以配置開關實現人工降級。降級的最終目的是保證核心服務可用,即使是有損的。而且有些服務是無法降級的(如加入購物車、結算)。
解決辦法:
(1)一般:比如有些服務偶爾因為網路抖動或者服務正在上線而超時,可以自動降級;
(2)警告:有些服務在一段時間內成功率有波動(如在95~100%之間),可以自動降級或人工降級,並傳送告警;
(3)錯誤:比如可用率低於90%,或者資料庫連線池被打爆了,或者訪問量突然猛增到系統能承受的最大閥值,此時可以根據情況自動降級或者人工降級;
(4)嚴重錯誤:比如因為特殊原因資料錯誤了,此時需要緊急人工降級。
Redis之快取雪崩,穿透,擊穿
快取雪崩,是指 系統剛上限時,資料還沒有載入到快取中 或者在某乙個時間點,快取中的資料大面積失效了,此時大量的查詢請求落在資料庫伺服器上,造成資料庫cpu和記憶體壓力過大,甚至宕機 解決方案 快取穿透是指 查詢乙個在資料庫中不可能存在的資料,此時快取miss了,然後再去資料庫中進行查詢,再miss掉...
Redis快取穿透,穿透擊穿,快取雪崩
乙個一定不存在快取及查詢不到的資料,由於快取是不命中時被動寫的,並且出於容錯考慮,如果從儲存層查不到資料則不寫入快取,這將導致這個不存在的資料每次請求都要到儲存層去查詢,失去了快取的意義。有很多種方法可以有效地解決快取穿透問題,最常見的則是採用布隆過濾器,將所有可能存在的資料雜湊到乙個足夠大的bit...
redis 快取穿透 擊穿 雪崩
介面層增加校驗,如使用者鑑權校驗,id做基礎校驗,id 0的直接攔截 從快取取不到的資料,在資料庫中也沒有取到,這時也可以將key value對寫為key null,快取有效時間可以設定短點,如30秒 設定太長會導致正常情況也沒法使用 這樣可以防止攻擊使用者反覆用同乙個id暴力攻擊 public o...