www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁 > 公眾號精選 > 小林coding
[導(dǎo)讀]用戶的數(shù)據(jù)一般都是存儲于數(shù)據(jù)庫,數(shù)據(jù)庫的數(shù)據(jù)是落在磁盤上的,磁盤的讀寫速度可以說是計(jì)算機(jī)里最慢的硬件了。

用戶的數(shù)據(jù)一般都是存儲于數(shù)據(jù)庫,數(shù)據(jù)庫的數(shù)據(jù)是落在磁盤上的,磁盤的讀寫速度可以說是計(jì)算機(jī)里最慢的硬件了。

當(dāng)用戶的請求,都訪問數(shù)據(jù)庫的話,請求數(shù)量一上來,數(shù)據(jù)庫很容易就奔潰的了,所以為了避免用戶直接訪問數(shù)據(jù)庫,會用 Redis 作為緩存層。

因?yàn)?Redis 是內(nèi)存數(shù)據(jù)庫,我們可以將數(shù)據(jù)庫的數(shù)據(jù)緩存在 Redis 里,相當(dāng)于數(shù)據(jù)緩存在內(nèi)存,內(nèi)存的讀寫速度比硬盤快好幾個(gè)數(shù)量級,這樣大大提高了系統(tǒng)性能。

引入了緩存層,就會有緩存異常的三個(gè)問題,分別是緩存雪崩、緩存擊穿、緩存穿透。

這三個(gè)問題也是面試中很常考察的問題,我們不光要清楚地知道它們是怎么發(fā)生,還需要知道如何解決它們。

話不多說,發(fā)車!


緩存雪崩

通常我們?yōu)榱吮WC緩存中的數(shù)據(jù)與數(shù)據(jù)庫中的數(shù)據(jù)一致性,會給 Redis 里的數(shù)據(jù)設(shè)置過期時(shí)間,當(dāng)緩存數(shù)據(jù)過期后,用戶訪問的數(shù)據(jù)如果不在緩存里,業(yè)務(wù)系統(tǒng)需要重新生成緩存,因此就會訪問數(shù)據(jù)庫,并將數(shù)據(jù)更新到 Redis 里,這樣后續(xù)請求都可以直接命中緩存。

那么,當(dāng)大量緩存數(shù)據(jù)在同一時(shí)間過期(失效)或者 Redis 故障宕機(jī)時(shí),如果此時(shí)有大量的用戶請求,都無法在 Redis 中處理,于是全部請求都直接訪問數(shù)據(jù)庫,從而導(dǎo)致數(shù)據(jù)庫的壓力驟增,嚴(yán)重的會造成數(shù)據(jù)庫宕機(jī),從而形成一系列連鎖反應(yīng),造成整個(gè)系統(tǒng)崩潰,這就是緩存雪崩的問題。

可以看到,發(fā)生緩存雪崩有兩個(gè)原因:

  • 大量數(shù)據(jù)同時(shí)過期;

  • Redis 故障宕機(jī);

不同的誘因,應(yīng)對的策略也會不同。

大量數(shù)據(jù)同時(shí)過期

針對大量數(shù)據(jù)同時(shí)過期而引發(fā)的緩存雪崩問題,常見的應(yīng)對方法有下面這幾種:

  • 均勻設(shè)置過期時(shí)間;

  • 互斥鎖;

  • 雙 key 策略;

  • 后臺更新緩存;

1. 均勻設(shè)置過期時(shí)間

如果要給緩存數(shù)據(jù)設(shè)置過期時(shí)間,應(yīng)該避免將大量的數(shù)據(jù)設(shè)置成同一個(gè)過期時(shí)間。我們可以在對數(shù)據(jù)設(shè)置過期時(shí)間時(shí),給這些數(shù)據(jù)的過期時(shí)間加上一個(gè)隨機(jī)數(shù),這樣就保證數(shù)據(jù)不會在同一時(shí)間過期。

2. 互斥鎖

當(dāng)業(yè)務(wù)線程在處理用戶請求時(shí),如果發(fā)現(xiàn)訪問的數(shù)據(jù)不在 Redis 里,就加個(gè)互斥鎖,保證同一時(shí)間內(nèi)只有一個(gè)請求來構(gòu)建緩存(從數(shù)據(jù)庫讀取數(shù)據(jù),再將數(shù)據(jù)更新到 Redis 里),當(dāng)緩存構(gòu)建完成后,再釋放鎖。未能獲取互斥鎖的請求,要么等待鎖釋放后重新讀取緩存,要么就返回空值或者默認(rèn)值。

實(shí)現(xiàn)互斥鎖的時(shí)候,最好設(shè)置超時(shí)時(shí)間,不然第一個(gè)請求拿到了鎖,然后這個(gè)請求發(fā)生了某種意外而一直阻塞,一直不釋放鎖,這時(shí)其他請求也一直拿不到鎖,整個(gè)系統(tǒng)就會出現(xiàn)無響應(yīng)的現(xiàn)象。

3. 雙 key 策略

我們對緩存數(shù)據(jù)可以使用兩個(gè) key,一個(gè)是主 key,會設(shè)置過期時(shí)間,一個(gè)是備 key,不會設(shè)置過期,它們只是 key 不一樣,但是 value 值是一樣的,相當(dāng)于給緩存數(shù)據(jù)做了個(gè)副本。

當(dāng)業(yè)務(wù)線程訪問不到「主 key 」的緩存數(shù)據(jù)時(shí),就直接返回「備 key 」的緩存數(shù)據(jù),然后在更新緩存的時(shí)候,同時(shí)更新「主 key 」和「備 key 」的數(shù)據(jù)。

4. 后臺更新緩存

業(yè)務(wù)線程不再負(fù)責(zé)更新緩存,緩存也不設(shè)置有效期,而是讓緩存“永久有效”,并將更新緩存的工作交由后臺線程定時(shí)更新。

事實(shí)上,緩存數(shù)據(jù)不設(shè)置有效期,并不是意味著數(shù)據(jù)一直能在內(nèi)存里,因?yàn)?/span>當(dāng)系統(tǒng)內(nèi)存緊張的時(shí)候,有些緩存數(shù)據(jù)會被“淘汰”,而在緩存被“淘汰”到下一次后臺定時(shí)更新緩存的這段時(shí)間內(nèi),業(yè)務(wù)線程讀取緩存失敗就返回空值,業(yè)務(wù)的視角就以為是數(shù)據(jù)丟失了。

解決上面的問題的方式有兩種。

第一種方式,后臺線程不僅負(fù)責(zé)定時(shí)更新緩存,而且也負(fù)責(zé)頻繁地檢測緩存是否有效,檢測到緩存失效了,原因可能是系統(tǒng)緊張而被淘汰的,于是就要馬上從數(shù)據(jù)庫讀取數(shù)據(jù),并更新到緩存。

這種方式的檢測時(shí)間間隔不能太長,太長也導(dǎo)致用戶獲取的數(shù)據(jù)是一個(gè)空值而不是真正的數(shù)據(jù),所以檢測的間隔最好是毫秒級的,但是總歸是有個(gè)間隔時(shí)間,用戶體驗(yàn)一般。

第二種方式,在業(yè)務(wù)線程發(fā)現(xiàn)緩存數(shù)據(jù)失效后(緩存數(shù)據(jù)被淘汰),通過消息隊(duì)列發(fā)送一條消息通知后臺線程更新緩存,后臺線程收到消息后,在更新緩存前可以判斷緩存是否存在,存在就不執(zhí)行更新緩存操作;不存在就讀取數(shù)據(jù)庫數(shù)據(jù),并將數(shù)據(jù)加載到緩存。這種方式相比第一種方式緩存的更新會更及時(shí),用戶體驗(yàn)也比較好。

在業(yè)務(wù)剛上線的時(shí)候,我們最好提前把數(shù)據(jù)緩起來,而不是等待用戶訪問才來觸發(fā)緩存構(gòu)建,這就是所謂的緩存預(yù)熱,后臺更新緩存的機(jī)制剛好也適合干這個(gè)事情。

Redis 故障宕機(jī)

針對 Redis 故障宕機(jī)而引發(fā)的緩存雪崩問題,常見的應(yīng)對方法有下面這幾種:

  • 服務(wù)熔斷或請求限流機(jī)制;

  • 構(gòu)建 Redis 緩存高可靠集群;

1. 服務(wù)熔斷或請求限流機(jī)制

因?yàn)?Redis 故障宕機(jī)而導(dǎo)致緩存雪崩問題時(shí),我們可以啟動(dòng)服務(wù)熔斷機(jī)制,暫停業(yè)務(wù)應(yīng)用對緩存服務(wù)的訪問,直接返回錯(cuò)誤,不用再繼續(xù)訪問數(shù)據(jù)庫,從而降低對數(shù)據(jù)庫的訪問壓力,保證數(shù)據(jù)庫系統(tǒng)的正常運(yùn)行,然后等到 Redis 恢復(fù)正常后,再允許業(yè)務(wù)應(yīng)用訪問緩存服務(wù)。

服務(wù)熔斷機(jī)制是保護(hù)數(shù)據(jù)庫的正常允許,但是暫停了業(yè)務(wù)應(yīng)用訪問緩存服系統(tǒng),全部業(yè)務(wù)都無法正常工作

為了減少對業(yè)務(wù)的影響,我們可以啟用請求限流機(jī)制,只將少部分請求發(fā)送到數(shù)據(jù)庫進(jìn)行處理,再多的請求就在入口直接拒絕服務(wù),等到 Redis 恢復(fù)正常并把緩存預(yù)熱完后,再解除請求限流的機(jī)制。

2. 構(gòu)建 Redis 緩存高可靠集群

服務(wù)熔斷或請求限流機(jī)制是緩存雪崩發(fā)生后的應(yīng)對方案,我們最好通過主從節(jié)點(diǎn)的方式構(gòu)建 Redis 緩存高可靠集群。

如果 Redis 緩存的主節(jié)點(diǎn)故障宕機(jī),從節(jié)點(diǎn)可以切換成為主節(jié)點(diǎn),繼續(xù)提供緩存服務(wù),避免了由于 Redis 故障宕機(jī)而導(dǎo)致的緩存雪崩問題。


緩存擊穿

我們的業(yè)務(wù)通常會有幾個(gè)數(shù)據(jù)會被頻繁地訪問,比如秒殺活動(dòng),這類被頻地訪問的數(shù)據(jù)被稱為熱點(diǎn)數(shù)據(jù)。

如果緩存中的某個(gè)熱點(diǎn)數(shù)據(jù)過期了,此時(shí)大量的請求訪問了該熱點(diǎn)數(shù)據(jù),就無法從緩存中讀取,直接訪問數(shù)據(jù)庫,數(shù)據(jù)庫很容易就被高并發(fā)的請求沖垮,這就是緩存擊穿的問題。

可以發(fā)現(xiàn)緩存擊穿跟緩存雪崩很相似,你可以認(rèn)為緩存擊穿是緩存雪崩的一個(gè)子集。

應(yīng)對緩存擊穿可以采取前面說到兩種方案:

  • 互斥鎖方案,保證同一時(shí)間只有一個(gè)業(yè)務(wù)線程更新緩存,未能獲取互斥鎖的請求,要么等待鎖釋放后重新讀取緩存,要么就返回空值或者默認(rèn)值。

  • 不給熱點(diǎn)數(shù)據(jù)設(shè)置過期時(shí)間,由后臺異步更新緩存,或者在熱點(diǎn)數(shù)據(jù)準(zhǔn)備要過期前,提前通知后臺線程更新緩存以及重新設(shè)置過期時(shí)間;


緩存穿透

當(dāng)發(fā)生緩存雪崩或擊穿時(shí),數(shù)據(jù)庫中還是保存了應(yīng)用要訪問的數(shù)據(jù),一旦緩存恢復(fù)相對應(yīng)的數(shù)據(jù),就可以減輕數(shù)據(jù)庫的壓力,而緩存穿透就不一樣了。

當(dāng)用戶訪問的數(shù)據(jù),既不在緩存中,也不在數(shù)據(jù)庫中,導(dǎo)致請求在訪問緩存時(shí),發(fā)現(xiàn)緩存缺失,再去訪問數(shù)據(jù)庫時(shí),發(fā)現(xiàn)數(shù)據(jù)庫中也沒有要訪問的數(shù)據(jù),沒辦法構(gòu)建緩存數(shù)據(jù),來服務(wù)后續(xù)的請求。那么當(dāng)有大量這樣的請求到來時(shí),數(shù)據(jù)庫的壓力驟增,這就是緩存穿透的問題。

緩存穿透的發(fā)生一般有這兩種情況:

  • 業(yè)務(wù)誤操作,緩存中的數(shù)據(jù)和數(shù)據(jù)庫中的數(shù)據(jù)都被誤刪除了,所以導(dǎo)致緩存和數(shù)據(jù)庫中都沒有數(shù)據(jù);

  • 黑客惡意攻擊,故意大量訪問某些讀取不存在數(shù)據(jù)的業(yè)務(wù);

應(yīng)對緩存穿透的方案,常見的方案有三種。

  • 第一種方案,非法請求的限制;

  • 第二種方案,緩存空值或者默認(rèn)值;

  • 第三種方案,使用布隆過濾器快速判斷數(shù)據(jù)是否存在,避免通過查詢數(shù)據(jù)庫來判斷數(shù)據(jù)是否存在;

第一種方案,非法請求的限制

當(dāng)有大量惡意請求訪問不存在的數(shù)據(jù)的時(shí)候,也會發(fā)生緩存穿透,因此在 API 入口處我們要判斷求請求參數(shù)是否合理,請求參數(shù)是否含有非法值、請求字段是否存在,如果判斷出是惡意請求就直接返回錯(cuò)誤,避免進(jìn)一步訪問緩存和數(shù)據(jù)庫。

第二種方案,緩存空值或者默認(rèn)值

當(dāng)我們線上業(yè)務(wù)發(fā)現(xiàn)緩存穿透的現(xiàn)象時(shí),可以針對查詢的數(shù)據(jù),在緩存中設(shè)置一個(gè)空值或者默認(rèn)值,這樣后續(xù)請求就可以從緩存中讀取到空值或者默認(rèn)值,返回給應(yīng)用,而不會繼續(xù)查詢數(shù)據(jù)庫。

第三種方案,使用布隆過濾器快速判斷數(shù)據(jù)是否存在,避免通過查詢數(shù)據(jù)庫來判斷數(shù)據(jù)是否存在。

我們可以在寫入數(shù)據(jù)庫數(shù)據(jù)時(shí),使用布隆過濾器做個(gè)標(biāo)記,然后在用戶請求到來時(shí),業(yè)務(wù)線程確認(rèn)緩存失效后,可以通過查詢布隆過濾器快速判斷數(shù)據(jù)是否存在,如果不存在,就不用通過查詢數(shù)據(jù)庫來判斷數(shù)據(jù)是否存在。

即使發(fā)生了緩存穿透,大量請求只會查詢 Redis 和布隆過濾器,而不會查詢數(shù)據(jù)庫,保證了數(shù)據(jù)庫能正常運(yùn)行,Redis 自身也是支持布隆過濾器的。

那問題來了,布隆過濾器是如何工作的呢?接下來,我介紹下。

布隆過濾器由「初始值都為 0 的位圖數(shù)組」和「 N 個(gè)哈希函數(shù)」兩部分組成。當(dāng)我們在寫入數(shù)據(jù)庫數(shù)據(jù)時(shí),在布隆過濾器里做個(gè)標(biāo)記,這樣下次查詢數(shù)據(jù)是否在數(shù)據(jù)庫時(shí),只需要查詢布隆過濾器,如果查詢到數(shù)據(jù)沒有被標(biāo)記,說明不在數(shù)據(jù)庫中。

布隆過濾器會通過 3 個(gè)操作完成標(biāo)記:

  • 第一步,使用 N 個(gè)哈希函數(shù)分別對數(shù)據(jù)做哈希計(jì)算,得到 N 個(gè)哈希值;

  • 第二步,將第一步得到的 N 個(gè)哈希值對位圖數(shù)組的長度取模,得到每個(gè)哈希值在位圖數(shù)組的對應(yīng)位置。

  • 第三步,將每個(gè)哈希值在位圖數(shù)組的對應(yīng)位置的值設(shè)置為 1;

舉個(gè)例子,假設(shè)有一個(gè)位圖數(shù)組長度為 8,哈希函數(shù) 3 個(gè)的布隆過濾器。

在數(shù)據(jù)庫寫入數(shù)據(jù) x 后,把數(shù)據(jù) x 標(biāo)記在布隆過濾器時(shí),數(shù)據(jù) x 會被 3 個(gè)哈希函數(shù)分別計(jì)算出 3 個(gè)哈希值,然后在對這 3 個(gè)哈希值對 8 取模,假設(shè)取模的結(jié)果為 1、4、6,然后把位圖數(shù)組的第 1、4、6 位置的值設(shè)置為 1。當(dāng)應(yīng)用要查詢數(shù)據(jù) x 是否數(shù)據(jù)庫時(shí),通過布隆過濾器只要查到位圖數(shù)組的第 1、4、6 位置的值是否全為 1,只要有一個(gè)為 0,就認(rèn)為數(shù)據(jù) x 不在數(shù)據(jù)庫中

布隆過濾器由于是基于哈希函數(shù)實(shí)現(xiàn)查找的,高效查找的同時(shí)存在哈希沖突的可能性,比如數(shù)據(jù) x 和數(shù)據(jù) y 可能都落在第 1、4、6 位置,而事實(shí)上,可能數(shù)據(jù)庫中并不存在數(shù)據(jù) y,存在誤判的情況。

所以,查詢布隆過濾器說數(shù)據(jù)存在,并不一定證明數(shù)據(jù)庫中存在這個(gè)數(shù)據(jù),但是查詢到數(shù)據(jù)不存在,數(shù)據(jù)庫中一定就不存在這個(gè)數(shù)據(jù)。


總結(jié)

緩存異常會面臨的三個(gè)問題:緩存雪崩、擊穿和穿透。

其中,緩存雪崩和緩存擊穿主要原因是數(shù)據(jù)不在緩存中,而導(dǎo)致大量請求訪問了數(shù)據(jù)庫,數(shù)據(jù)庫壓力驟增,容易引發(fā)一系列連鎖反應(yīng),導(dǎo)致系統(tǒng)奔潰。不過,一旦數(shù)據(jù)被重新加載回緩存,應(yīng)用又可以從緩存快速讀取數(shù)據(jù),不再繼續(xù)訪問數(shù)據(jù)庫,數(shù)據(jù)庫的壓力也會瞬間降下來。因此,緩存雪崩和緩存擊穿應(yīng)對的方案比較類似。

而緩存穿透主要原因是數(shù)據(jù)既不在緩存也不在數(shù)據(jù)庫中。因此,緩存穿透與緩存雪崩、擊穿應(yīng)對的方案不太一樣。

我這里整理了表格,你可以從下面這張表格很好的知道緩存雪崩、擊穿和穿透的區(qū)別以及應(yīng)對方案。


免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運(yùn)營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動(dòng)現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡稱"軟通動(dòng)力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉