面試官:講一下緩存穿透、緩存雪崩和緩存擊穿?

{"type":"doc","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"原創首發公衆號:「bigsai」"}]},{"type":"heading","attrs":{"align":null,"level":1},"content":[{"type":"text","text":"緩存穿透、緩存雪崩和緩存擊穿"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"如果不瞭解,可能對這幾個概念都不瞭解,聽着感覺太高大上,至少筆者剛開始是這麼覺得,本文並不是詳細介紹如何解決和完美解決,更主要的是認識和認知吧。"}]},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/c6/c6fe7f166d70461a304961349f744962.png","alt":"在這裏插入圖片描述","title":null,"style":null,"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/63/637230a91290a40e60992eaa7a80a51f.png","alt":"在這裏插入圖片描述","title":null,"style":null,"href":null,"fromPaste":true,"pastePass":true}},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":" redis緩存穿透"}]},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/9a/9a430dd78ba077f98d5b33a5cb0cfbe4.png","alt":"在這裏插入圖片描述","title":null,"style":null,"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"理解"},{"type":"text","text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"重在"},{"type":"codeinline","content":[{"type":"text","text":"穿透"}]},{"type":"text","text":"吧,也就是訪問透過redis直接經過mysql,通常是一個不存在的"},{"type":"codeinline","content":[{"type":"text","text":"key"}]},{"type":"text","text":",在數據庫查詢爲"},{"type":"codeinline","content":[{"type":"text","text":"null"}]},{"type":"text","text":"。每次請求落在數據庫、並且高併發。數據庫扛不住會掛掉。"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"解決方案"}]},{"type":"bulletedlist","content":[{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"可以將查到的null設成該key的緩存對象。"}]}]},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"當然,也可以根據明顯錯誤的key在邏輯層就就行"},{"type":"codeinline","content":[{"type":"text","text":"驗證"}]},{"type":"text","text":"。"}]}]},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"同時,你也可以分析用戶行爲,是否爲故意請求或者爬蟲、攻擊者。針對用戶訪問做限制。"}]}]},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"其他等等,比如用布隆過濾器(超大型hashmap)先過濾。"}]}]}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":" redis緩存雪崩"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"理解"},{"type":"text","text":" "}]},{"type":"bulletedlist","content":[{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"雪崩,就是某"},{"type":"codeinline","content":[{"type":"text","text":"東西蜂擁而至"}]},{"type":"text","text":"的意思,像雪崩一樣。在這裏,就是redis緩存集體"},{"type":"codeinline","content":[{"type":"text","text":"大規模集體失效"}]},{"type":"text","text":",在高併發情況下突然使得key大規模訪問mysql,使得數據庫崩掉。可以想象下國家"},{"type":"codeinline","content":[{"type":"text","text":"人口老年化"}]},{"type":"text","text":"。以後那天人集中在70-80歲,就沒人幹活了。國家勞動力就造成壓力。"}]}]}]},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/0a/0a3fa8286b22ed0a32429e8c37fed6a7.png","alt":"在這裏插入圖片描述","title":null,"style":null,"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"解決方案"}]},{"type":"bulletedlist","content":[{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"通常的解決方案是將key的過期時間後面加上一個"},{"type":"codeinline","content":[{"type":"text","text":"隨機數"}]},{"type":"text","text":",讓key均勻的失效。"}]}]},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"考慮用隊列或者鎖讓程序執行在壓力範圍之內,當然這種方案可能會影響併發量。"}]}]},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"熱點數據可以考慮不失效"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":" redis緩存擊穿"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"理解"},{"type":"text","text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"緩存擊穿,是指一個key非常熱點,在不停的扛着大併發,大併發集中對這一個點進行訪問,當這個key在失效的瞬間,持續的大併發就穿破緩存,直接請求數據庫,好像蠻力擊穿一樣。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" "}]},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/72/727e239dc92f17bad42ccf5bc4519bd5.png","alt":"在這裏插入圖片描述","title":null,"style":null,"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"擊穿和穿透不同,穿透的意思是想法"},{"type":"codeinline","content":[{"type":"text","text":"繞過"}]},{"type":"text","text":"redis去使得數據庫崩掉。而擊穿你可以理解爲"},{"type":"codeinline","content":[{"type":"text","text":"正面剛"}]},{"type":"text","text":"擊穿,這種通常爲大量併發對一個key進行大規模的讀寫操作。這個key在緩存失效期間大量請求數據庫,對數據庫造成太大壓力使得數據庫崩掉。就"},{"type":"codeinline","content":[{"type":"text","text":"比如"}]},{"type":"text","text":"在秒殺場景下10000塊錢的mac和100塊的mac這個100塊的那個訂單肯定會被搶到爆,不斷的請求(當然具體秒殺有自己處理方式這裏只是舉個例子)。所以緩存擊穿就是針對某個常用key大量請求導致數據庫崩潰。"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"解決方案"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"可以使用互斥鎖避免大量請求同時落到db。"}]}]},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"布隆過濾器,判斷某個容器是否在集合中"}]}]},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"可以將緩存設置永不過期(適合部分情況)"}]}]},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"做好熔斷、降級,防止系統崩潰。"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"下篇文章會講解redis緩存與關係數據庫數據一致性各種場景分析,敬請期待。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/94/94c78bebaaa8532137c2dc643564cf69.png","alt":null,"title":null,"style":null,"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}}]}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章