面试官:缓存穿透、缓存雪崩和缓存击穿是什么?
生活随笔
收集整理的這篇文章主要介紹了
面试官:缓存穿透、缓存雪崩和缓存击穿是什么?
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
前言
原創(chuàng)公眾號(hào):bigsai
對(duì)于緩存穿透、緩存雪崩和緩存擊穿常常出現(xiàn)在面試中,今天來看看它到底是啥吧?
redis緩存穿透
理解
- 重在穿透吧,也就是訪問透過redis直接經(jīng)過mysql,通常是一個(gè)不存在的key,在數(shù)據(jù)庫(kù)查詢?yōu)閚ull。每次請(qǐng)求落在數(shù)據(jù)庫(kù)、并且高并發(fā)。數(shù)據(jù)庫(kù)扛不住會(huì)掛掉。
解決方案
- 可以將查到的null設(shè)成該key的緩存對(duì)象。
- 當(dāng)然,也可以根據(jù)明顯錯(cuò)誤的key在邏輯層就就行驗(yàn)證。
- 同時(shí),你也可以分析用戶行為,是否為故意請(qǐng)求或者爬蟲、攻擊者。針對(duì)用戶訪問做限制。
- 其他等等,比如用布隆過濾器(超大型hashmap)先過濾。
redis緩存雪崩
理解
- 雪崩,就是某東西蜂擁而至的意思,像雪崩一樣。在這里,就是redis緩存集體大規(guī)模集體失效,在高并發(fā)情況下突然使得key大規(guī)模訪問mysql,使得數(shù)據(jù)庫(kù)崩掉。可以想象下國(guó)家人口老年化。以后那天人集中在70-80歲,就沒人干活了。國(guó)家勞動(dòng)力就造成壓力。
解決方案
- 通常的解決方案是將key的過期時(shí)間后面加上一個(gè)隨機(jī)數(shù),讓key均勻的失效。
- 考慮用隊(duì)列或者鎖讓程序執(zhí)行在壓力范圍之內(nèi),當(dāng)然這種方案可能會(huì)影響并發(fā)量。
- 熱點(diǎn)數(shù)據(jù)可以考慮不失效
redis緩存擊穿
理解
緩存擊穿,是指一個(gè)key非常熱點(diǎn),在不停的扛著大并發(fā),大并發(fā)集中對(duì)這一個(gè)點(diǎn)進(jìn)行訪問,當(dāng)這個(gè)key在失效的瞬間,持續(xù)的大并發(fā)就穿破緩存,直接請(qǐng)求數(shù)據(jù)庫(kù),好像蠻力擊穿一樣。
- 擊穿和穿透不同,穿透的意思是想法繞過redis去使得數(shù)據(jù)庫(kù)崩掉。而擊穿你可以理解為正面剛擊穿,這種通常為大量并發(fā)對(duì)一個(gè)key進(jìn)行大規(guī)模的讀寫操作。這個(gè)key在緩存失效期間大量請(qǐng)求數(shù)據(jù)庫(kù),對(duì)數(shù)據(jù)庫(kù)造成太大壓力使得數(shù)據(jù)庫(kù)崩掉。就比如在秒殺場(chǎng)景下10000塊錢的mac和100塊的mac這個(gè)100塊的那個(gè)訂單肯定會(huì)被搶到爆,不斷的請(qǐng)求(當(dāng)然具體秒殺有自己處理方式這里只是舉個(gè)例子)。所以緩存擊穿就是針對(duì)某個(gè)常用key大量請(qǐng)求導(dǎo)致數(shù)據(jù)庫(kù)崩潰。
解決方案
- 可以使用互斥鎖避免大量請(qǐng)求同時(shí)落到db。
- 布隆過濾器,判斷某個(gè)容器是否在集合中
- 可以將緩存設(shè)置永不過期(適合部分情況)
- 做好熔斷、降級(jí),防止系統(tǒng)崩潰。
原創(chuàng)公眾號(hào):「bigsai」,回復(fù)bigsai獲取8G pdf資源!
總結(jié)
以上是生活随笔為你收集整理的面试官:缓存穿透、缓存雪崩和缓存击穿是什么?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 爬虫实现csdn文章一键(批量)更换阅读
- 下一篇: 数据结构于算法—线性表