緩存擊穿、失效以及熱點(diǎn)key問(wèn)題

分布式緩存是網(wǎng)站服務(wù)端經(jīng)常用到的一種技術(shù),在讀多寫(xiě)少的業(yè)務(wù)場(chǎng)景中,通過(guò)使用緩存可以有效地支撐高并發(fā)的訪(fǎng)問(wèn)量,對(duì)后端的數(shù)據(jù)庫(kù)等數(shù)據(jù)源做到很好地保護(hù)?,F(xiàn)在市面上有很多分布式緩存,比如Redis、Memcached以及阿里的Tair等,不管我們使用的哪種緩存產(chǎn)品,基本上都會(huì)遇到緩存擊穿、緩存失效以及熱點(diǎn)key的問(wèn)題。如何有效地防止這些問(wèn)題,也是我們?cè)谙硎芫彺鎺?lái)的紅利地同時(shí),必須要解決地難題。

通常我們?cè)谑褂镁彺鏁r(shí)候都是先檢查緩存中是否存在,如果存在直接返回緩存內(nèi)容,如果不存在就直接查詢(xún)數(shù)據(jù)庫(kù)然后再緩存查詢(xún)結(jié)果返回,例如下圖所示,


緩存使用.png

緩存擊穿:
  查詢(xún)一個(gè)數(shù)據(jù)庫(kù)中不存在的數(shù)據(jù),比如商品詳情,查詢(xún)一個(gè)不存在的ID,每次都會(huì)訪(fǎng)問(wèn)DB,如果有人惡意破壞,很可能直接對(duì)DB造成過(guò)大地壓力。

緩存擊穿的解決方案:
  當(dāng)通過(guò)某一個(gè)key去查詢(xún)數(shù)據(jù)的時(shí)候,如果對(duì)應(yīng)在數(shù)據(jù)庫(kù)中的數(shù)據(jù)都不存在,我們將此key對(duì)應(yīng)的value設(shè)置為一個(gè)默認(rèn)的值,比如“NULL”,并設(shè)置一個(gè)緩存的失效時(shí)間,這時(shí)在緩存失效之前,所有通過(guò)此key的訪(fǎng)問(wèn)都被緩存擋住了。后面如果此key對(duì)應(yīng)的數(shù)據(jù)在DB中存在時(shí),緩存失效之后,通過(guò)此key再去訪(fǎng)問(wèn)數(shù)據(jù),就能拿到新的value了。

緩存失效:
  在高并發(fā)的環(huán)境下,如果此時(shí)key對(duì)應(yīng)的緩存失效,此時(shí)有多個(gè)進(jìn)程就會(huì)去同時(shí)去查詢(xún)DB,然后再去同時(shí)設(shè)置緩存。這個(gè)時(shí)候如果這個(gè)key是系統(tǒng)中的熱點(diǎn)key或者同時(shí)失效的數(shù)量比較多時(shí),DB訪(fǎng)問(wèn)量會(huì)瞬間增大,造成過(guò)大的壓力。

緩存失效的解決方案:

  • 將系統(tǒng)中key的緩存失效時(shí)間均勻地錯(cuò)開(kāi),防止統(tǒng)一時(shí)間點(diǎn)有大量的key對(duì)應(yīng)的緩存失效;
  • 重新設(shè)計(jì)緩存的使用方式,當(dāng)我們通過(guò)key去查詢(xún)數(shù)據(jù)時(shí),首先查詢(xún)緩存,如果此時(shí)緩存中查詢(xún)不到,就通過(guò)分布式鎖進(jìn)行加鎖,取得鎖的進(jìn)程查DB并設(shè)置緩存,然后解鎖;其他進(jìn)程如果發(fā)現(xiàn)有鎖就等待,然后等解鎖后返回緩存數(shù)據(jù)或者再次查詢(xún)DB。

熱點(diǎn)key:
  緩存中的某些Key(可能對(duì)應(yīng)用與某個(gè)促銷(xiāo)商品)對(duì)應(yīng)的value存儲(chǔ)在集群中一臺(tái)機(jī)器,使得所有流量涌向同一機(jī)器,成為系統(tǒng)的瓶頸,該問(wèn)題的挑戰(zhàn)在于它無(wú)法通過(guò)增加機(jī)器容量來(lái)解決。

熱點(diǎn)key的解決方案:

  • 客戶(hù)端熱點(diǎn)key緩存:將熱點(diǎn)key對(duì)應(yīng)value并緩存在客戶(hù)端本地,并且設(shè)置一個(gè)失效時(shí)間。對(duì)于每次讀請(qǐng)求,將首先檢查key是否存在于本地緩存中,如果存在則直接返回,如果不存在再去訪(fǎng)問(wèn)分布式緩存的機(jī)器。
  • 將熱點(diǎn)key分散為多個(gè)子key,然后存儲(chǔ)到緩存集群的不同機(jī)器上,這些子key對(duì)應(yīng)的value都和熱點(diǎn)key是一樣的。當(dāng)通過(guò)熱點(diǎn)key去查詢(xún)數(shù)據(jù)時(shí),通過(guò)某種hash算法隨機(jī)選擇一個(gè)子key,然后再去訪(fǎng)問(wèn)緩存機(jī)器,將熱點(diǎn)分散到了多個(gè)子key上。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • [TOC] NetCahe:Balancing Key-Value Stores with Fast In-Net...
    hyfine閱讀 2,109評(píng)論 0 3
  • 不管我們使用的哪種緩存產(chǎn)品,基本上都會(huì)遇到緩存擊穿、緩存失效以及熱點(diǎn)key的問(wèn)題。一旦出現(xiàn)上述問(wèn)題,如洪水般的請(qǐng)求...
    zhanglbjames閱讀 2,492評(píng)論 10 8
  • 感恩貴人 一路相助 沒(méi)有當(dāng)年的經(jīng)歷 就沒(méi)有現(xiàn)在 感恩?。。?/div>
    西西光輝閱讀 125評(píng)論 0 0
  • 這個(gè)季節(jié)在瘋長(zhǎng),我們都學(xué)會(huì)了遺忘 多少迷惘,多少年少輕狂,都已離場(chǎng) 我在悄悄的奢望,爬上那年掛著諾言的樹(shù)上 夢(mèng)鄉(xiāng)你...
    迷曳閱讀 206評(píng)論 2 1
  • 今晚我的兩位同桌已同時(shí)在群里發(fā)表更文,我看看時(shí)間,還不到十點(diǎn)半。 同桌水心梓,一個(gè)人帶著2個(gè)多月的寶寶,今天更文2...
    林潓甄閱讀 327評(píng)論 20 14

友情鏈接更多精彩內(nèi)容