使用緩存需要注意的幾個問題

前言

現(xiàn)在的網(wǎng)站基本上都會加入緩存層來提升性能表現(xiàn)锻霎,前端請求會先去緩存層請求數(shù)據(jù),若未命中緩存才會去請求數(shù)據(jù)庫層吼旧,這樣可以大大減少去數(shù)據(jù)庫層請求的連接數(shù)梨与,減少數(shù)據(jù)庫壓力堕花,加快接口響應(yīng)速度。

緩存雖然是性能利器粥鞋,但在高并發(fā)情況下使用不當可能會導(dǎo)致以下幾個問題缘挽。

緩存穿透

定義:以最常用的緩存中間件Redis為例,我們將緩存數(shù)據(jù)以K/V的形式存儲在Redis中呻粹,通過查詢key是否在Redis中存在來判斷是否命中緩存壕曼。一般情況下我們只將查詢結(jié)果不為空的數(shù)據(jù)進行緩存。緩存穿透指的是前端請求的數(shù)據(jù)在緩存中一定不存在尚猿,導(dǎo)致請求直接訪問數(shù)據(jù)庫窝稿,若惡意構(gòu)造大量這樣的請求訪問系統(tǒng),那么數(shù)據(jù)庫有可能會因為訪問量過大而被壓垮凿掂。

解決方案

1.對查詢結(jié)果為空的key也進行緩存伴榔。當我們緩存空數(shù)據(jù)時,再有相同條件的查詢請求時庄萎,直接返回空即可而不必去請求數(shù)據(jù)庫踪少。由于導(dǎo)致結(jié)果為空值的查詢條件可能會比較多,這樣會導(dǎo)致緩存中存在大量value為空值的K/V對糠涛,為了解決這個問題援奢,我們可以將數(shù)據(jù)為空的緩存的過期時間設(shè)置的較短一些,使其快速過期忍捡,以釋放內(nèi)存空間集漾。

2.使用布隆過濾器(對布隆過濾器不清楚的同學(xué)請看我之前的這篇文章布隆過濾器)。我們按照查詢條件去查詢數(shù)據(jù)砸脊,查詢條件一定是有限的具篇,我們可以將所有可能的查詢參數(shù)組合都放入布隆過濾器中,在controller中進行校驗凌埂,在布隆過濾器中不存在的參數(shù)組合則會被過濾掉直接返回驱显。這樣連緩存層都不用訪問了。

緩存雪崩

定義:緩存雪崩指的是緩存服務(wù)器重啟或者緩存服務(wù)器宕機瞳抓,那么此時所有的請求都會到達數(shù)據(jù)庫層埃疫,導(dǎo)致數(shù)據(jù)庫被壓垮。

解決方案:使用緩存服務(wù)器集群孩哑,保證緩存的高可用栓霜,這個方案更偏向于架構(gòu)與運維一些。

熱點key

定義:熱點key其實可以看做緩存雪崩的一個子類横蜒,這里把他分出來是為了結(jié)構(gòu)更加清晰一點叙淌。一般情況下我們會給緩存設(shè)置過期時間秤掌,熱點key指的是對于一些請求量較高的熱點數(shù)據(jù)而言,一旦集中過期鹰霍,此時將會有大量請求落在數(shù)據(jù)庫層闻鉴,從而可能會導(dǎo)致數(shù)據(jù)庫崩潰∶鳎或者均訪問一臺服務(wù)器達到網(wǎng)卡上限

解決方案

1.錯開過期時間孟岛。為了防止一批熱點key同時失效,我們可以為這些key設(shè)置不同的過期時間督勺,使其過期時間盡量錯開渠羞。

2.使用互斥鎖。利用Redis的setnx命令或者多參數(shù)的set命令實現(xiàn)互斥鎖智哀,只讓一個線程去查詢數(shù)據(jù)庫構(gòu)建緩存次询,其他線程等待該線程執(zhí)行完成,重新從緩存獲取數(shù)據(jù)就可以了瓷叫。

3.永不過期屯吊。指的是不為緩存設(shè)置過期時間,只在value中存一個邏輯上的過期時間摹菠,每次get發(fā)現(xiàn)邏輯過期時間小于當前時間則新建一個線程去數(shù)據(jù)庫重新獲取數(shù)據(jù)構(gòu)建緩存盒卸。

4.接口限流。這個方案就不涉及緩存操作相關(guān)代碼了次氨,就純粹是做接口上的限流操作蔽介。關(guān)于如何做限流請看我之前的這篇文章關(guān)于限流

5. 使用本地緩存

6. 利用分片煮寡,將一個key備份多份虹蓄,存儲在集群的不同機器上,將訪問量均攤到所有實例幸撕。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末薇组,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子杈帐,更是在濱河造成了極大的恐慌,老刑警劉巖专钉,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件挑童,死亡現(xiàn)場離奇詭異,居然都是意外死亡跃须,警方通過查閱死者的電腦和手機站叼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來菇民,“玉大人尽楔,你說我怎么就攤上這事投储。” “怎么了阔馋?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵玛荞,是天一觀的道長。 經(jīng)常有香客問我呕寝,道長勋眯,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任下梢,我火速辦了婚禮客蹋,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘孽江。我一直安慰自己讶坯,他們只是感情好,可當我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布岗屏。 她就那樣靜靜地躺著辆琅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪担汤。 梳的紋絲不亂的頭發(fā)上涎跨,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天,我揣著相機與錄音崭歧,去河邊找鬼隅很。 笑死,一個胖子當著我的面吹牛率碾,可吹牛的內(nèi)容都是我干的叔营。 我是一名探鬼主播,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼所宰,長吁一口氣:“原來是場噩夢啊……” “哼绒尊!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起仔粥,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤婴谱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后躯泰,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谭羔,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年麦向,在試婚紗的時候發(fā)現(xiàn)自己被綠了瘟裸。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡诵竭,死狀恐怖话告,靈堂內(nèi)的尸體忽然破棺而出兼搏,到底是詐尸還是另有隱情,我是刑警寧澤沙郭,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布佛呻,位于F島的核電站,受9級特大地震影響棠绘,放射性物質(zhì)發(fā)生泄漏件相。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一氧苍、第九天 我趴在偏房一處隱蔽的房頂上張望夜矗。 院中可真熱鬧,春花似錦让虐、人聲如沸紊撕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽对扶。三九已至,卻和暖如春惭缰,著一層夾襖步出監(jiān)牢的瞬間浪南,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工漱受, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留络凿,地道東北人。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓昂羡,卻偏偏與公主長得像絮记,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子虐先,可洞房花燭夜當晚...
    茶點故事閱讀 44,601評論 2 353

推薦閱讀更多精彩內(nèi)容