緩存那些事(四)緩存面臨的挑戰(zhàn)

緩存那些事(一)概述

緩存那些事(二)什么是緩存以及緩存的作用

緩存那些事(三)如何構(gòu)建緩存

緩存那些事(四)緩存面臨的挑戰(zhàn)

緩存使用處理得當(dāng)絕對(duì)能很大程度上提高程序性能,目前緩存技術(shù)早已應(yīng)用在各大平臺(tái)系統(tǒng)中。但使用不當(dāng)不僅可能降低程序性能,還可能挖出讓你痛不欲生的神坑,多么痛的領(lǐng)悟....

下面我先來列一列使用緩存所要面臨的一系列挑戰(zhàn)犹菱,然后逐個(gè)分析,限于個(gè)人水平有限可能會(huì)分析漏了或不到位的地方,請(qǐng)見諒;舯取!

1. 緩存更新

數(shù)據(jù)庫的數(shù)據(jù)不是一成不變暴备,當(dāng)數(shù)據(jù)發(fā)生了改變悠瞬,如何同步到緩存中?在數(shù)據(jù)同步前或同步中,如何防止用戶讀到臟數(shù)據(jù)浅妆。

2. 緩存穿透

查詢一個(gè)必然不存在的數(shù)據(jù)望迎。比如文章表,查詢一個(gè)不存在的id狂打,每次都會(huì)訪問DB擂煞,如果有人惡意破壞,很可能直接對(duì)DB造成影響趴乡。

3. 緩存并發(fā)

網(wǎng)站并發(fā)訪問高对省,一個(gè)緩存如果失效,可能出現(xiàn)多個(gè)進(jìn)程同時(shí)查詢DB晾捏,同時(shí)設(shè)置緩存的情況蒿涎,如果并發(fā)確實(shí)很大,這也可能造成DB壓力過大惦辛,還有緩存頻繁更新的問題劳秋。

4. 緩存失效

引起這個(gè)問題的主要原因還是高并發(fā)的時(shí)候,平時(shí)我們?cè)O(shè)定一個(gè)緩存的過期時(shí)間時(shí)胖齐,可能有一些會(huì)設(shè)置1分鐘啊玻淑,5分鐘這些,并發(fā)很高時(shí)可能會(huì)出在某一個(gè)時(shí)間同時(shí)生成了很多的緩存呀伙,并且過期時(shí)間都一樣补履,這個(gè)時(shí)候就可能引發(fā)一當(dāng)過期時(shí)間到后,這些緩存同時(shí)失效剿另,請(qǐng)求全部轉(zhuǎn)發(fā)到DB箫锤,DB可能會(huì)壓力過重

5. 數(shù)據(jù)序列化

把數(shù)據(jù)保存到緩存中,需要對(duì)數(shù)據(jù)進(jìn)行序列化和反序列化雨女,這是一個(gè)時(shí)間消耗較大的操作谚攒,序列化的消耗也是衡量緩存性能的指標(biāo)之一

就以上幾個(gè)問題,給出部分解決方案氛堕,但沒有最好的方案只有針對(duì)業(yè)務(wù)特征的最合適方案

緩存更新

1. 如果允許短時(shí)間內(nèi)的數(shù)據(jù)不同步馏臭,可采用"淘汰緩存"和"更新緩存"兩種方案,下面來對(duì)比一下這兩種方案

方案一:"淘汰緩存"就是先清空緩存再更新數(shù)據(jù)庫岔擂,那么請(qǐng)求已清空的緩存數(shù)據(jù)時(shí)將重新加載數(shù)據(jù)庫對(duì)應(yīng)數(shù)據(jù)

優(yōu)點(diǎn):簡單

缺點(diǎn):一次cache miss

這種方案也不能100%保證不會(huì)有臟數(shù)據(jù)位喂,原因如下:

在寫請(qǐng)求完成前,有讀請(qǐng)求出現(xiàn)乱灵,這時(shí)又讀入臟數(shù)據(jù)到緩存

"更新緩存"就是先更新數(shù)據(jù)再更新緩存

優(yōu)點(diǎn):cache命中率高

缺點(diǎn):如果更新緩存失敗則讀取到臟數(shù)據(jù)塑崖,同時(shí)在寫請(qǐng)求完成前讀請(qǐng)求進(jìn)來也是會(huì)讀到臟數(shù)據(jù)

針對(duì)方案二:如果更新緩存失敗,可采用定時(shí)重試機(jī)制進(jìn)行緩存更新

2. 假設(shè)采用方案一痛倚,如果存在讀寫分離的情況规婆,既緩存數(shù)據(jù)來源于讀庫,則可能會(huì)產(chǎn)生下面問題

寫請(qǐng)求成功了,但主庫還沒同步到從庫抒蚜,這時(shí)讀請(qǐng)求產(chǎn)生掘鄙,讀庫的臟數(shù)據(jù)就會(huì)被讀入緩存

解決方案:上述情況是由于主從同步延時(shí)造成的,可以增加采用異步更新緩存線程嗡髓,該線程監(jiān)聽從庫日志操漠,發(fā)現(xiàn)記錄變化后再次更新緩存。監(jiān)聽日志再異步更新還能一定程度上解決方案一與方案二中的臟數(shù)據(jù)饿这,異步更新成功讀請(qǐng)求就再不會(huì)讀到臟數(shù)據(jù)浊伙,只會(huì)有小概率讀到臟數(shù)據(jù)

緩存穿透

當(dāng)訪問某個(gè)key的value為null向數(shù)據(jù)庫請(qǐng)求數(shù)據(jù)也null時(shí),先給該的value設(shè)置一個(gè)標(biāo)志如&&长捧,表明該key暫沒有value嚣鄙,當(dāng)有寫請(qǐng)求寫到數(shù)據(jù)庫再更新緩存,之后讀請(qǐng)求就能讀到數(shù)據(jù)了

緩存并發(fā)

如果KEY不存在串结,就加鎖哑子,然后查DB入緩存,然后解鎖肌割;其他進(jìn)程如果發(fā)現(xiàn)有鎖就等待卧蜓,然后等解鎖后返回?cái)?shù)據(jù)或者進(jìn)入DB查詢。

這種情況和剛才說的預(yù)先設(shè)定值問題有些類似把敞,只不過利用鎖的方式烦却,會(huì)造成部分請(qǐng)求等待。

緩存失效

緩存失效時(shí)間分散開先巴,比如我們可以在原有的失效時(shí)間基礎(chǔ)上增加一個(gè)隨機(jī)值,比如1~5分鐘隨機(jī)冒冬,這樣每一個(gè)緩存的過期時(shí)間的重復(fù)率就會(huì)降低伸蚯,就很難引發(fā)集體失效的事件。(針對(duì)多個(gè)緩存來說)

數(shù)據(jù)序列化

將數(shù)據(jù)保存到內(nèi)存中和從內(nèi)存中取出使用是需要經(jīng)過序列化與反序列化简烤,這個(gè)過程不僅有時(shí)間消耗還會(huì)有空間消耗剂邮,序列化后的數(shù)據(jù)比序列化前更大,因?yàn)椴迦牒芏鄻?biāo)記横侦。所以只緩存有價(jià)值的數(shù)據(jù)也可以降低序列化帶來的性能消耗挥萌。但關(guān)鍵還是選擇合適的序列化協(xié)議,通用性強(qiáng)的有json枉侧、xml(json速度更快引瀑,序列化后大數(shù)據(jù)更小)榨馁,如果要求性能的有Protobuf憨栽,Thrift,Avro

歡迎Q群交流:432550774

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市屑柔,隨后出現(xiàn)的幾起案子屡萤,更是在濱河造成了極大的恐慌,老刑警劉巖掸宛,帶你破解...
    沈念sama閱讀 218,284評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件死陆,死亡現(xiàn)場離奇詭異,居然都是意外死亡唧瘾,警方通過查閱死者的電腦和手機(jī)措译,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來劈愚,“玉大人瞳遍,你說我怎么就攤上這事【穑” “怎么了掠械?”我有些...
    開封第一講書人閱讀 164,614評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長注祖。 經(jīng)常有香客問我猾蒂,道長,這世上最難降的妖魔是什么是晨? 我笑而不...
    開封第一講書人閱讀 58,671評(píng)論 1 293
  • 正文 為了忘掉前任肚菠,我火速辦了婚禮,結(jié)果婚禮上罩缴,老公的妹妹穿的比我還像新娘蚊逢。我一直安慰自己,他們只是感情好箫章,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評(píng)論 6 392
  • 文/花漫 我一把揭開白布烙荷。 她就那樣靜靜地躺著,像睡著了一般檬寂。 火紅的嫁衣襯著肌膚如雪终抽。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,562評(píng)論 1 305
  • 那天桶至,我揣著相機(jī)與錄音昼伴,去河邊找鬼。 笑死镣屹,一個(gè)胖子當(dāng)著我的面吹牛圃郊,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播女蜈,決...
    沈念sama閱讀 40,309評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼描沟,長吁一口氣:“原來是場噩夢啊……” “哼飒泻!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起吏廉,我...
    開封第一講書人閱讀 39,223評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤泞遗,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后席覆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體史辙,經(jīng)...
    沈念sama閱讀 45,668評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評(píng)論 3 336
  • 正文 我和宋清朗相戀三年佩伤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了聊倔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,981評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡生巡,死狀恐怖耙蔑,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情孤荣,我是刑警寧澤甸陌,帶...
    沈念sama閱讀 35,705評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站盐股,受9級(jí)特大地震影響钱豁,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜疯汁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評(píng)論 3 330
  • 文/蒙蒙 一牲尺、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧幌蚊,春花似錦谤碳、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至沫换,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間最铁,已是汗流浹背讯赏。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評(píng)論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留冷尉,地道東北人漱挎。 一個(gè)月前我還...
    沈念sama閱讀 48,146評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像雀哨,于是被迫代替她去往敵國和親磕谅。 傳聞我的和親對(duì)象是個(gè)殘疾皇子私爷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評(píng)論 2 355

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