redis緩存雪崩、緩存擊穿和緩存穿透是什么

這篇文章主要介紹了redis緩存雪崩、緩存擊穿和緩存穿透是什么的相關(guān)知識,內(nèi)容詳細(xì)易懂,操作簡單快捷,具有一定借鑒價(jià)值,相信大家閱讀完這篇redis緩存雪崩、緩存擊穿和緩存穿透是什么文章都會有所收獲,下面我們一起來看看吧。

創(chuàng)新互聯(lián)公司是一家專業(yè)提供平山企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站建設(shè)、做網(wǎng)站、H5高端網(wǎng)站建設(shè)、小程序制作等業(yè)務(wù)。10年已為平山眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站制作公司優(yōu)惠進(jìn)行中。

緩存雪崩

首先來看看緩存雪崩,緩存雪崩的概念就是:大量的請求沒有在Redis緩存中得到處理,從而導(dǎo)致請求都涌入到數(shù)據(jù)庫中,然后數(shù)據(jù)庫的壓力劇增。

引起緩存雪崩的原因可總結(jié)為2個(gè):

  • 緩存中有大量的數(shù)據(jù)同時(shí)過期,這樣此時(shí)大量的請求都懟到數(shù)據(jù)庫了。

  • Redis緩存實(shí)例發(fā)生故障了,無法處理大量請求,也會導(dǎo)致請求都跑到數(shù)據(jù)庫去了。

先來看看第一個(gè)場景:緩存中大量的數(shù)據(jù)同時(shí)過期問題。

緩存中大量的數(shù)據(jù)同時(shí)過期

結(jié)合圖例來看,就是大量的數(shù)據(jù)在同一時(shí)間過期,然后此時(shí)又有很多的請求要讀取這些數(shù)據(jù)。當(dāng)然就會發(fā)生緩存雪崩,從而導(dǎo)致數(shù)據(jù)庫壓力劇增了。

redis緩存雪崩、緩存擊穿和緩存穿透是什么

大量數(shù)據(jù)同時(shí)過期的解決方案

應(yīng)對大量數(shù)據(jù)同時(shí)過期問題,通常有2種方案:

  • 數(shù)據(jù)過期設(shè)置增加隨機(jī)時(shí)間:也就是用expire命令給數(shù)據(jù)設(shè)置過期時(shí)間時(shí),增加一個(gè)隨機(jī)的時(shí)間,比如數(shù)據(jù)a是5分鐘過期,在5分鐘的基礎(chǔ)上隨機(jī)增加10-120秒時(shí)間。這樣就能避免大量數(shù)據(jù)同時(shí)過期。

  • 服務(wù)降級:也就是發(fā)生緩存雪崩時(shí),(1)若訪問的不是核心數(shù)據(jù),當(dāng)沒有緩存命中時(shí),不去數(shù)據(jù)庫了,直接返回預(yù)先設(shè)置好的信息,比如空值或者錯誤信息;(2)當(dāng)訪問的是核心數(shù)據(jù),緩存未命中時(shí),允許去數(shù)據(jù)庫查詢。這樣就將不是核心數(shù)據(jù)的請求都拒絕懟到數(shù)據(jù)庫了。

redis緩存雪崩、緩存擊穿和緩存穿透是什么

看完了大量數(shù)據(jù)同時(shí)過期的情況,再來看看Redis緩存實(shí)例故障的情況。

Redis緩存實(shí)例故障導(dǎo)致的緩存雪崩

這種情況下,Redis無法處理讀請求了,請求自然就懟到數(shù)據(jù)庫了。

通常來說,應(yīng)對這種情況,我們也有2種方式:

  • 在業(yè)務(wù)系統(tǒng)中做好服務(wù)熔斷/請求限流。

  • 事前預(yù)防:構(gòu)建Redis高可靠集群,比如主從集群的主備切換。

服務(wù)熔斷,也就是當(dāng)Redis發(fā)生故障時(shí),暫停請求對緩存系統(tǒng)的訪問。等到Redis恢復(fù)正常了再打開請求訪問。

這種方式我們需要對Redis或數(shù)據(jù)庫的運(yùn)行狀態(tài)進(jìn)行監(jiān)控,比如MySQL的負(fù)載壓力、Redis的CPU使用率、內(nèi)存使用率及QPS等。當(dāng)發(fā)現(xiàn)Redis實(shí)例緩存雪崩了,就暫停服務(wù)。

這種情況能有效放置大量請求對數(shù)據(jù)庫造成壓力。但是會暫停請求訪問,對業(yè)務(wù)端的影響很大。

redis緩存雪崩、緩存擊穿和緩存穿透是什么

因此,為了減少對業(yè)務(wù)端的影響,我們可以使用請求限流方式,控制QPS,避免過多的請求懟到數(shù)據(jù)庫去。比如下面圖例,本身有2萬每秒的請求,但因?yàn)镽edis故障宕機(jī)了。我們限流操作將qps降到2千每秒,數(shù)據(jù)庫處理2000的qps還是沒問題的。

redis緩存雪崩、緩存擊穿和緩存穿透是什么

緩存擊穿

緩存擊穿就是指個(gè)別訪問頻繁的熱點(diǎn)數(shù)據(jù)無法緩存命中,然后請求都涌入到數(shù)據(jù)庫中。它經(jīng)常會在熱點(diǎn)數(shù)據(jù)過期時(shí)發(fā)生。

redis緩存雪崩、緩存擊穿和緩存穿透是什么

對于緩存擊穿問題,我們知道這些都是被訪問非常頻繁的熱點(diǎn)數(shù)據(jù),處理方式就簡單粗暴了,直接不設(shè)置過期時(shí)間了。等熱點(diǎn)數(shù)據(jù)不頻繁訪問再手動處理即可。

緩存穿透

緩存雪崩有些特別,它是指要訪問的數(shù)據(jù)既不在Redis緩存,也不在數(shù)據(jù)庫中。當(dāng)大量請求進(jìn)到系統(tǒng)時(shí),Redis和數(shù)據(jù)庫都會有巨大壓力。

redis緩存雪崩、緩存擊穿和緩存穿透是什么

導(dǎo)致緩存穿透的原因通常有2種:

  • 數(shù)據(jù)被誤刪除了,導(dǎo)致緩存和數(shù)據(jù)庫都沒有數(shù)據(jù)了。然而客戶端是不知道的,還在瘋狂請求。

  • 有惡意攻擊的情況:也就是被人盯上了,專門去查沒有的數(shù)據(jù)。

對于緩存穿透的情況,解決方案可以參考下面幾種:

  • 是對緩存設(shè)置空值或者默認(rèn)值。比如發(fā)生緩存穿透時(shí),在Redis緩存中設(shè)置空值/默認(rèn)值。后續(xù)查詢該值時(shí)就直接返回這個(gè)默認(rèn)值了。

  • 使用布隆過濾器來判斷數(shù)據(jù)是否存在,避免從數(shù)據(jù)庫查詢。

  • 在前端就進(jìn)行請求檢測。比如在前端將一些不合法的請求直接過濾,不要發(fā)到后端來處理。

第一點(diǎn)和第三點(diǎn)比較容易理解,這里就不展開描述。我們重點(diǎn)來看看第二點(diǎn):布隆過濾器。

布隆過濾器

布隆過濾器主要用于判斷一個(gè)元素是否在一個(gè)集合中。它是由一個(gè)固定大小的二進(jìn)制向量(可理解成默認(rèn)為0的bit數(shù)組)和一系列的映射函數(shù)組成的。

我們首先來看看布隆過濾器是如何標(biāo)記一個(gè)數(shù)據(jù)a的:

  • 第一步,會使用到多個(gè)映射函數(shù)(哈希函數(shù)),每個(gè)函數(shù)都會計(jì)算這個(gè)數(shù)據(jù)a的哈希值;

  • 第二步,這些計(jì)算得出的哈希值會分別對bit數(shù)組長度取模,這樣就得到每個(gè)哈希值在數(shù)組上的位置;

  • 第三步,把第二步得到的位置,分別在bit數(shù)組上設(shè)置為1。

通過這3個(gè)步驟,數(shù)據(jù)標(biāo)記就完成了。然后要查詢數(shù)據(jù)在不在的時(shí)候是這樣做的:

  • 先計(jì)算這個(gè)數(shù)據(jù)在bit數(shù)組中的多個(gè)位置;

  • 然后分別查看bit數(shù)組的這些位置的bit值。只有每個(gè)位置的bit值都為1,說明數(shù)據(jù)才可能存在,否則數(shù)據(jù)一定不存在。

結(jié)合下圖來看,基本原理就是這樣。

redis緩存雪崩、緩存擊穿和緩存穿透是什么

關(guān)于“redis緩存雪崩、緩存擊穿和緩存穿透是什么”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對“redis緩存雪崩、緩存擊穿和緩存穿透是什么”知識都有一定的了解,大家如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

本文名稱:redis緩存雪崩、緩存擊穿和緩存穿透是什么
URL標(biāo)題:http://muchs.cn/article48/pphjhp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制網(wǎng)站、商城網(wǎng)站、Google、電子商務(wù)靜態(tài)網(wǎng)站、服務(wù)器托管

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)