亚洲最大看欧美片,亚洲图揄拍自拍另类图片,欧美精品v国产精品v呦,日本在线精品视频免费

  • 站長(zhǎng)資訊網(wǎng)
    最全最豐富的資訊網(wǎng)站

    一起聊聊Redis三種緩存問(wèn)題

    本篇文章給大家?guī)?lái)了關(guān)于Redis的相關(guān)知識(shí),主要介紹三種緩存問(wèn)題,也就是緩存穿透、緩存擊穿和緩存雪崩的相關(guān)內(nèi)容,希望對(duì)大家有幫助。

    一起聊聊Redis三種緩存問(wèn)題

    推薦學(xué)習(xí):Redis學(xué)習(xí)教程

    一、Redis緩存的應(yīng)用

    在我們的實(shí)際業(yè)務(wù)場(chǎng)景中,Redis 一般和其他數(shù)據(jù)庫(kù)搭配使用,用來(lái)減輕后端數(shù)據(jù)庫(kù)的壓力,比如和關(guān)系型數(shù)據(jù)庫(kù) MySQL 配合使用。

    Redis 會(huì)把 MySQL經(jīng)常被查詢的數(shù)據(jù)緩存起來(lái),比如熱點(diǎn)數(shù)據(jù),這樣當(dāng)用戶來(lái)訪問(wèn)的時(shí)候,就不需要到 MySQL 中去查詢了,而是直接獲取 Redis 中的緩存數(shù)據(jù),從而降低了后端數(shù)據(jù)庫(kù)的讀取壓力。

    如果說(shuō)用戶查詢的數(shù)據(jù) Redis 沒(méi)有,此時(shí)用戶的查詢請(qǐng)求就會(huì)轉(zhuǎn)到 MySQL 數(shù)據(jù)庫(kù),當(dāng) MySQL 將數(shù)據(jù)返回給客戶端時(shí),同時(shí)會(huì)將數(shù)據(jù)緩存到 Redis 中,這樣用戶再次讀取時(shí),就可以直接從 Redis 中獲取數(shù)據(jù)。流程圖如下所示:

    一起聊聊Redis三種緩存問(wèn)題

    當(dāng)然,我們?cè)谑褂?span style="color:#be191c;">Redis作為緩存數(shù)據(jù)庫(kù)的過(guò)程中也并不是總能一帆風(fēng)順,我們會(huì)遇到常見(jiàn)的三種緩存問(wèn)題

    • 緩存穿透
    • 緩存擊穿
    • 緩存雪崩

    二、緩存穿透

    2.1 介紹

    緩存穿透是指當(dāng)用戶查詢某個(gè)數(shù)據(jù)時(shí),Redis 中不存在該數(shù)據(jù),也就是緩存沒(méi)有命中,此時(shí)查詢請(qǐng)求就會(huì)轉(zhuǎn)向持久層數(shù)據(jù)庫(kù) MySQL,結(jié)果發(fā)現(xiàn) MySQL 中也不存在該數(shù)據(jù),MySQL 只能返回一個(gè)空對(duì)象,代表此次查詢失敗。如果這種類請(qǐng)求非常多,或者用戶利用這種請(qǐng)求進(jìn)行惡意攻擊,就會(huì)給 MySQL 數(shù)據(jù)庫(kù)造成很大壓力,甚至于崩潰,這種現(xiàn)象就叫緩存穿透。

    一起聊聊Redis三種緩存問(wèn)題

    2.2 解決方案

    緩存空對(duì)象

    當(dāng) MySQL 返回空對(duì)象時(shí), Redis 將該對(duì)象緩存起來(lái),同時(shí)為其設(shè)置一個(gè)過(guò)期時(shí)間。當(dāng)用戶再次發(fā)起相同請(qǐng)求時(shí),就會(huì)從緩存中拿到一個(gè)空對(duì)象,用戶的請(qǐng)求被阻斷在了緩存層,從而保護(hù)了后端數(shù)據(jù)庫(kù),但是這種做法也存在一些問(wèn)題,雖然請(qǐng)求進(jìn)不了 MSQL,但是這種策略會(huì)占用 Redis 的緩存空間。

    一起聊聊Redis三種緩存問(wèn)題

    布隆過(guò)濾器

    首先將用戶可能會(huì)訪問(wèn)的熱點(diǎn)數(shù)據(jù)的所有key存儲(chǔ)在布隆過(guò)濾器中(也稱緩存預(yù)熱),當(dāng)有一個(gè)用戶請(qǐng)求時(shí)會(huì)先經(jīng)過(guò)布隆過(guò)濾器,布隆過(guò)濾器會(huì)判斷請(qǐng)求的key是否存在,若不存在,那么該請(qǐng)求將直接被拒絕,否則將繼續(xù)執(zhí)行查詢,先前往緩存中查詢,緩存沒(méi)有的話再前往數(shù)據(jù)庫(kù)中查詢。相較于第一種方法,用布隆過(guò)濾器方法更為高效、實(shí)用。其流程示意圖如下:

    一起聊聊Redis三種緩存問(wèn)題

    緩存預(yù)熱:是指系統(tǒng)啟動(dòng)時(shí),提前將相關(guān)的數(shù)據(jù)加載到 Redis 緩存系統(tǒng)中。這樣避免了用戶請(qǐng)求的時(shí)再去加載數(shù)據(jù)。

    2.3 解決方案的比較

    兩種方案都可以解決緩存穿透的問(wèn)題,但其使用的場(chǎng)景卻不同:

    緩存空對(duì)象:適用于空數(shù)據(jù)的key數(shù)量有限、key重復(fù)請(qǐng)求概率較高的場(chǎng)景。

    布隆過(guò)濾器:適用于空數(shù)據(jù)的key各不相同、key重復(fù)請(qǐng)求概率較低的場(chǎng)景。

    三、緩存擊穿

    3.1 介紹

    緩存擊穿是指用戶查詢的數(shù)據(jù)緩存中不存在,但是后端數(shù)據(jù)庫(kù)卻存在,這種現(xiàn)象出現(xiàn)原因是一般是由緩存中 key 過(guò)期導(dǎo)致的。比如一個(gè)熱點(diǎn)數(shù)據(jù) key,它無(wú)時(shí)無(wú)刻都在接受大量的并發(fā)訪問(wèn),如果某一時(shí)刻這個(gè) key 突然失效了,就致使大量的并發(fā)請(qǐng)求進(jìn)入后端數(shù)據(jù)庫(kù),導(dǎo)致其壓力瞬間增大。這種現(xiàn)象被稱為緩存擊穿。

    3.2 解決方案

    改變過(guò)期時(shí)間

    設(shè)置熱點(diǎn)數(shù)據(jù)永不過(guò)期。

    分布式鎖

    采用分布式鎖的方法,重新設(shè)計(jì)緩存的使用方式,過(guò)程如下:

    • 上鎖:當(dāng)我們通過(guò) key 去查詢數(shù)據(jù)時(shí),首先查詢緩存,如果沒(méi)有,就通過(guò)分布式鎖進(jìn)行加鎖,第一個(gè)獲取鎖的進(jìn)程進(jìn)入后端數(shù)據(jù)庫(kù)查詢,并將查詢結(jié)果緩到Redis 中。
    • 解鎖:當(dāng)其他進(jìn)程發(fā)現(xiàn)鎖被某個(gè)進(jìn)程占用時(shí),就進(jìn)入等待狀態(tài),直至解鎖后,其余進(jìn)程再依次訪問(wèn)被緩存的 key。

    一起聊聊Redis三種緩存問(wèn)題

    3.3 解決方案的比較

    永遠(yuǎn)不過(guò)期 :這種方案由于沒(méi)有設(shè)置真正的過(guò)期時(shí)間,實(shí)際上已經(jīng)不存在熱點(diǎn) key 產(chǎn)生的一系列危害,但是會(huì)存在數(shù)據(jù)不一致的情況,同時(shí)代碼復(fù)雜度會(huì)增大。

    互斥鎖:這種方案思路比較簡(jiǎn)單,但是存在一定的隱患,如果構(gòu)建緩存過(guò)程出現(xiàn)問(wèn)題或者時(shí)間較長(zhǎng),可能會(huì)存在死鎖和線程池阻塞的風(fēng)險(xiǎn),但是這種方法能夠較好的降低后端存儲(chǔ)負(fù)載并在一致性上做的比較好。

    四、緩存雪崩

    4.1 介紹

    緩存雪崩是指緩存中大批量的 key 同時(shí)過(guò)期,而此時(shí)數(shù)據(jù)訪問(wèn)量又非常大,從而導(dǎo)致后端數(shù)據(jù)庫(kù)壓力突然暴增,甚至?xí)斓簦@種現(xiàn)象被稱為緩存雪崩。它和緩存擊穿不同,緩存擊穿是在并發(fā)量特別大時(shí),某一個(gè)熱點(diǎn) key 突然過(guò)期,而緩存雪崩則是大量的 key 同時(shí)過(guò)期,因此它們根本不是一個(gè)量級(jí)

    一起聊聊Redis三種緩存問(wèn)題

    4.2 解決方案

    處理過(guò)期

    緩存雪崩和緩存擊穿有相似之處,所以也可以采用熱點(diǎn)數(shù)據(jù)永不過(guò)期的方法,來(lái)減少大批量的 key 同時(shí)過(guò)期。再者就是為 key 設(shè)置隨機(jī)過(guò)期時(shí)間,避免 key 集中過(guò)期。

    redis高可用

    一臺(tái)Redis可能會(huì)因?yàn)檠┍蓝鴴斓?,那么可以多增設(shè)幾臺(tái)Redis,搭建集群,如果一臺(tái)掛掉之后,其他的還可以繼續(xù)工作。

    推薦學(xué)習(xí):Redis學(xué)習(xí)教程

    贊(0)
    分享到: 更多 (0)
    網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)