自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Redis緩存的三大問(wèn)題與解決方案

數(shù)據(jù)庫(kù) Redis
緩存空對(duì)象,針對(duì)這些惡意構(gòu)建的key在Redis中緩存一個(gè)空值并設(shè)置一個(gè)過(guò)期時(shí)間,那么后續(xù)請(qǐng)求是不會(huì)到達(dá)Mysql上,而是直接通過(guò)Redis返回的一個(gè)空值給到用戶。

    Redis的三大緩存問(wèn)題也就是緩存擊穿、緩存雪崩和緩存穿透,在生產(chǎn)環(huán)境中會(huì)因?yàn)檫@些原因造成請(qǐng)求繞過(guò)了Redis直接訪問(wèn)數(shù)據(jù)庫(kù),使得數(shù)據(jù)庫(kù)的負(fù)載增大,這樣不僅導(dǎo)致緩存的作用降低,甚至引發(fā)數(shù)據(jù)庫(kù)壓力過(guò)大而崩潰進(jìn)而蔓延到整個(gè)系統(tǒng)無(wú)法使用。下面我們來(lái)聊聊Redis緩存的三大問(wèn)題與解決方案。

1、緩存雪崩

    緩存雪崩指的是由于Redis里面同一時(shí)間出現(xiàn)了多個(gè)key同時(shí)失效,導(dǎo)致大量請(qǐng)求直接訪問(wèn)數(shù)據(jù)庫(kù),瞬間引發(fā)數(shù)據(jù)庫(kù)壓力激增,甚至導(dǎo)致數(shù)據(jù)庫(kù)崩潰,如下圖所示:

圖片圖片

解決方案:

(1)將Redis進(jìn)行高可用的架構(gòu)部署(主從+哨兵、集群),避免Redis出現(xiàn)全盤崩潰宕機(jī)的情況。

(2)使用本地緩存、Histrix限流降級(jí)、Nginx IP限流等等方法,避免Mysql被大流量沖垮,同時(shí)在緩存不可用時(shí)可以返回一些默認(rèn)值或者降級(jí)的數(shù)據(jù)。

(3)針對(duì)于Redis里面的key設(shè)置一個(gè)合理的過(guò)期時(shí)間(如緩存的過(guò)期時(shí)間為隨機(jī)值),避免大量的key同時(shí)失效。

2、緩存擊穿

    緩存擊穿是指某個(gè)熱點(diǎn)數(shù)據(jù)A在緩存中失效的瞬間,此時(shí)又有大量的并發(fā)請(qǐng)求同時(shí)訪問(wèn)該數(shù)據(jù)A,由于數(shù)據(jù)A在緩存中失效,大量請(qǐng)求同時(shí)訪問(wèn)數(shù)據(jù)庫(kù),造成數(shù)據(jù)庫(kù)壓力驟增。這種情況通常發(fā)生在熱點(diǎn)數(shù)據(jù)或訪問(wèn)頻繁的數(shù)據(jù)上,如下如圖所示的:

圖片圖片

    通常Mysql只能支持2000個(gè)請(qǐng)求的并發(fā)量,Redis中的key_1正在承擔(dān)4000個(gè)請(qǐng)求的并發(fā)量,由于key_1瞬間失效導(dǎo)致4000個(gè)并發(fā)請(qǐng)求直接請(qǐng)求數(shù)據(jù)庫(kù),可能就會(huì)導(dǎo)致Mysql瞬間宕機(jī),進(jìn)而蔓延整個(gè)系統(tǒng)都無(wú)法使用。

解決方案:

(1)給key設(shè)置一個(gè)合理的過(guò)期時(shí)間,可以將這個(gè)熱點(diǎn)數(shù)據(jù)設(shè)置為永不過(guò)期,或者及時(shí)的給熱點(diǎn)key進(jìn)行續(xù)期。

(2)使用互斥鎖,我們可以基于Redis或Zookeeper實(shí)現(xiàn)一個(gè)互斥鎖,等待第一個(gè)請(qǐng)求構(gòu)建緩存之后,再來(lái)釋放鎖。如下圖所示:

圖片圖片

    這樣后續(xù)的其他的請(qǐng)求就會(huì)通過(guò)Redis來(lái)查詢數(shù)據(jù),那么大量的請(qǐng)求就不會(huì)到達(dá)Mysql上而導(dǎo)致其的性能下降甚至出現(xiàn)宕機(jī)的問(wèn)題。

(3)對(duì)一些熱點(diǎn)數(shù)據(jù)提前加載并定期刷新緩存,防止緩存失效。

3、緩存穿透

    緩存穿透是指客戶端頻繁訪問(wèn)一些根本不存在的緩存數(shù)據(jù),由于緩存中沒(méi)有這些數(shù)據(jù)的記錄,每次請(qǐng)求都直接訪問(wèn)數(shù)據(jù)庫(kù)導(dǎo)致數(shù)據(jù)庫(kù)壓力增大,但是數(shù)據(jù)庫(kù)中也不存在這個(gè)數(shù)據(jù)。

圖片圖片

    通常是由于攻擊者輸入非法或惡意構(gòu)造的請(qǐng)求訪問(wèn)服務(wù),由于Redis緩存的不存在,此時(shí)大量請(qǐng)求都是直接到達(dá)Mysql上。

解決方案:

(1)緩存空對(duì)象,針對(duì)這些惡意構(gòu)建的key在Redis中緩存一個(gè)空值并設(shè)置一個(gè)過(guò)期時(shí)間,那么后續(xù)請(qǐng)求是不會(huì)到達(dá)Mysql上,而是直接通過(guò)Redis返回的一個(gè)空值給到用戶。設(shè)置過(guò)期時(shí)間是因?yàn)殡S著系統(tǒng)的運(yùn)行這部分?jǐn)?shù)據(jù)可能后面會(huì)產(chǎn)生,那么key的過(guò)期時(shí)間到了之后,key會(huì)被Redis刪除,后面有用戶正常來(lái)訪問(wèn)的時(shí)候,這個(gè)key它會(huì)被重新緩存到Redis上。

(2)參數(shù)校驗(yàn),在系統(tǒng)前端或者應(yīng)用層對(duì)請(qǐng)求的參數(shù)進(jìn)行有效性驗(yàn)證,過(guò)濾掉明顯無(wú)效或惡意的請(qǐng)求,如請(qǐng)求參數(shù)為主鍵id是大于0的,那么對(duì)于請(qǐng)求小于0的id參數(shù)是明顯不符合要求的,可以直接返回錯(cuò)誤請(qǐng)求。

(3)布隆過(guò)濾器,判斷這些請(qǐng)求參數(shù)是否存在Redis和Mysql中,如果布隆過(guò)濾器判斷這些請(qǐng)求參數(shù)不存在Redis和Mysql中就直接返回,這樣惡意構(gòu)建的這些請(qǐng)求就被攔截了,當(dāng)然布隆過(guò)濾器存在一定的誤判率。

責(zé)任編輯:武曉燕 來(lái)源: 龍蝦編程
相關(guān)推薦

2018-11-12 12:12:15

架構(gòu)師緩存數(shù)據(jù)庫(kù)

2022-06-21 13:48:30

Redis緩存

2024-12-02 01:16:53

2024-05-23 07:59:42

RedisKey性能

2010-05-12 14:18:58

Linux引導(dǎo)

2010-09-07 13:24:18

CSS

2018-05-30 08:10:34

智慧農(nóng)業(yè)物聯(lián)網(wǎng)物聯(lián)網(wǎng)應(yīng)用

2011-05-19 14:16:29

網(wǎng)頁(yè)設(shè)計(jì)

2018-11-12 11:12:46

2019-10-08 16:05:19

Redis數(shù)據(jù)庫(kù)系統(tǒng)

2010-10-08 16:31:08

AjaxIE6

2019-10-09 16:18:36

緩存架構(gòu)雪崩

2017-02-16 16:01:07

人工智能解決方案

2009-09-15 10:46:06

Visual Stud

2021-01-31 10:51:37

緩存lock數(shù)據(jù)

2024-07-12 08:48:50

2021-09-13 22:31:24

人工智能疫情技術(shù)

2024-05-29 12:47:27

2024-10-31 11:52:05

緩存預(yù)熱系統(tǒng)

2024-11-08 13:47:35

中文亂碼配置
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)