偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

三大問(wèn)題!Redis緩存異常及處理方案總結(jié)

開(kāi)發(fā)
Redis作為最常用的緩存方式,在提高數(shù)據(jù)查詢效率、保護(hù)數(shù)據(jù)庫(kù)等方面起到了不可磨滅的作用,但實(shí)際應(yīng)用中,可能會(huì)出現(xiàn)一些Redis緩存異常的情況,本文主要對(duì)Redis緩存異常及處理方案進(jìn)行了總結(jié)。

Redis作為一個(gè)高性能的內(nèi)存中的key-value數(shù)據(jù)結(jié)構(gòu)存儲(chǔ)系統(tǒng),在我們?nèi)粘i_(kāi)發(fā)中廣泛應(yīng)用于緩存、計(jì)數(shù)器、消息隊(duì)列、排行榜等場(chǎng)景中,尤其是作為最常用的緩存方式,在提高數(shù)據(jù)查詢效率、保護(hù)數(shù)據(jù)庫(kù)等方面起到了不可磨滅的作用,但實(shí)際應(yīng)用中,可能會(huì)出現(xiàn)一些Redis緩存異常的情況,本文主要對(duì)Redis緩存異常及處理方案進(jìn)行了總結(jié)。

1. 背景

Redis是一個(gè)完全開(kāi)源的、遵守BSD協(xié)議的、高性能的key-value數(shù)據(jù)結(jié)構(gòu)存儲(chǔ)系統(tǒng),它支持?jǐn)?shù)據(jù)的持久化,可以將內(nèi)存中的數(shù)據(jù)保存在磁盤中,而且不僅僅支持簡(jiǎn)單的key-value類型的數(shù)據(jù),同時(shí)還提供list,set,zset,hash等數(shù)據(jù)結(jié)構(gòu)的存儲(chǔ),功能十分強(qiáng)大,Redis還支持?jǐn)?shù)據(jù)的備份,即master-slave模式的數(shù)據(jù)備份,從而提高可用性。當(dāng)然最重要的還是讀寫(xiě)速度快,作為我們平常開(kāi)發(fā)中最常用的緩存方案被廣泛應(yīng)用。但在實(shí)際應(yīng)用過(guò)程中,它會(huì)存在緩存雪崩、緩存擊穿和緩存穿透等異常情況,如果忽視這些情況可能會(huì)帶來(lái)災(zāi)難性的后果,下面主要對(duì)這些緩存異常和常見(jiàn)處理方案進(jìn)行相應(yīng)分析與總結(jié)。

2. 緩存雪崩

(1) 是什么

一段時(shí)間內(nèi)本應(yīng)在redis緩存中處理的大量請(qǐng)求,都發(fā)送到了數(shù)據(jù)庫(kù)進(jìn)行處理,導(dǎo)致對(duì)數(shù)據(jù)庫(kù)的壓力迅速增大,嚴(yán)重時(shí)甚至可能導(dǎo)致數(shù)據(jù)庫(kù)崩潰,從而導(dǎo)致整個(gè)系統(tǒng)崩潰,就像雪崩一樣,引發(fā)連鎖效應(yīng),所以叫緩存雪崩。

(2) 為什么

出現(xiàn)上述情況的常見(jiàn)原因主要有以下兩點(diǎn):

  • 大量緩存數(shù)據(jù)同時(shí)過(guò)期,導(dǎo)致本應(yīng)請(qǐng)求到緩存的需重新從數(shù)據(jù)庫(kù)中獲取數(shù)據(jù)。
  • redis本身出現(xiàn)故障,無(wú)法處理請(qǐng)求,那自然會(huì)再請(qǐng)求到數(shù)據(jù)庫(kù)那里。

(3) 怎么辦

針對(duì)大量緩存數(shù)據(jù)同時(shí)過(guò)期的情況:

  • 實(shí)際設(shè)置過(guò)期時(shí)間時(shí),應(yīng)當(dāng)盡量避免大量key同時(shí)過(guò)期的場(chǎng)景,如果真的有,那就通過(guò)隨機(jī)、微調(diào)、均勻設(shè)置等方式設(shè)置過(guò)期時(shí)間,從而避免同一時(shí)間過(guò)期。
  • 添加互斥鎖,使得構(gòu)建緩存的操作不會(huì)在同一時(shí)間進(jìn)行。
  • 雙key策略,主key是原始緩存,備key為拷貝緩存,主key失效時(shí),可以訪問(wèn)備key,主key緩存失效時(shí)間設(shè)置為短期,備key設(shè)置為長(zhǎng)期。
  • 后臺(tái)更新緩存策略,采用定時(shí)任務(wù)或者消息隊(duì)列的方式進(jìn)行redis緩存更新或移除等。

針對(duì)redis本身出現(xiàn)故障的情況:

  • 在預(yù)防層面,可以通過(guò)主從節(jié)點(diǎn)的方式構(gòu)建高可用的集群,也就是實(shí)現(xiàn)主Redis實(shí)例掛掉后,能有其他從庫(kù)快速切換為主庫(kù),繼續(xù)提供服務(wù)。
  • 如果事情已經(jīng)發(fā)生了,那就要為了防止數(shù)據(jù)庫(kù)被大量的請(qǐng)求搞崩潰,可以采用服務(wù)熔斷或者請(qǐng)求限流的方法。當(dāng)然服務(wù)熔斷相對(duì)粗暴一些,停止服務(wù)直到redis服務(wù)恢復(fù),請(qǐng)求限流相對(duì)溫和一些,保證一些請(qǐng)求可以處理,不是一刀切,不過(guò)還是看具體業(yè)務(wù)情況選擇合適的處理方案。

3. 緩存擊穿

(1) 是什么

緩存擊穿一般出現(xiàn)在高并發(fā)系統(tǒng)中,是大量并發(fā)用戶同時(shí)請(qǐng)求到緩存中沒(méi)有但數(shù)據(jù)庫(kù)中有的數(shù)據(jù),也就是同時(shí)讀緩存沒(méi)讀到數(shù)據(jù),又同時(shí)去數(shù)據(jù)庫(kù)去取數(shù)據(jù),引起數(shù)據(jù)庫(kù)壓力瞬間增大。和緩存雪崩不同的是,緩存擊穿指并發(fā)查同一條數(shù)據(jù),緩存雪崩是不同數(shù)據(jù)都過(guò)期了,很多數(shù)據(jù)都查不到從而查數(shù)據(jù)庫(kù)。

(2) 為什么

這種情況其實(shí)一般出現(xiàn)的原因就是某個(gè)熱點(diǎn)數(shù)據(jù)緩存過(guò)期,由于是熱點(diǎn)數(shù)據(jù),請(qǐng)求并發(fā)量又大,所以過(guò)期的時(shí)候還是會(huì)有大量請(qǐng)求同時(shí)過(guò)來(lái),來(lái)不及更新緩存就全部打到數(shù)據(jù)庫(kù)那邊了。

(3) 怎么辦

針對(duì)這種情況有兩種常見(jiàn)的處理方案:

  • 簡(jiǎn)單粗暴的對(duì)熱點(diǎn)數(shù)據(jù)不設(shè)置過(guò)期時(shí)間,這樣不會(huì)過(guò)期,自然也就不會(huì)出現(xiàn)上述情況了,如果后續(xù)想清理,可以通過(guò)后臺(tái)進(jìn)行清理。
  • 添加互斥鎖,即當(dāng)過(guò)期之后,除了請(qǐng)求過(guò)來(lái)的第一個(gè)查詢的請(qǐng)求可以獲取到鎖請(qǐng)求到數(shù)據(jù)庫(kù),并再次更新到緩存中,其他的會(huì)被阻塞住,直到鎖被釋放,同時(shí)新的緩存也被更新上去了,后續(xù)請(qǐng)求又會(huì)請(qǐng)求到緩存上,這樣就不會(huì)出現(xiàn)緩存擊穿了。

4. 緩存穿透

(1) 是什么

緩存穿透是指數(shù)據(jù)既不在redis中,也不在數(shù)據(jù)庫(kù)中,這樣就導(dǎo)致每次請(qǐng)求過(guò)來(lái)的時(shí)候,在緩存中找不到對(duì)應(yīng)key之后,每次都還要去數(shù)據(jù)庫(kù)再查詢一遍,發(fā)現(xiàn)數(shù)據(jù)庫(kù)也沒(méi)有,相當(dāng)于進(jìn)行了兩次無(wú)用的查詢。這樣請(qǐng)求就可以繞過(guò)緩存直接查數(shù)據(jù)庫(kù),如果這個(gè)時(shí)候有人想惡意攻擊系統(tǒng),就可以故意使用空值或者其他不存在的值進(jìn)行頻繁請(qǐng)求,那么就會(huì)對(duì)數(shù)據(jù)庫(kù)造成比較大的壓力。

(2) 為什么

這種現(xiàn)象的原因其實(shí)很好理解,業(yè)務(wù)邏輯里面如果用戶對(duì)某些信息還沒(méi)有進(jìn)行相應(yīng)的操作或者處理,那對(duì)應(yīng)的存放信息的數(shù)據(jù)庫(kù)或者緩存中自然也就沒(méi)有相應(yīng)的數(shù)據(jù),也就容易出現(xiàn)上述問(wèn)題。

(3) 怎么辦

針對(duì)緩存穿透,一般有以下三種處理方案:

  • 非法請(qǐng)求的限制,主要是指參數(shù)校驗(yàn)、鑒權(quán)校驗(yàn)等,從而一開(kāi)始就把大量的非法請(qǐng)求攔截在外,這在實(shí)際業(yè)務(wù)開(kāi)發(fā)中是必要的手段。
  • 緩存空值或者默認(rèn)值,如果從緩存取不到的數(shù)據(jù),在數(shù)據(jù)庫(kù)中也沒(méi)有取到,那我們?nèi)匀话堰@個(gè)空結(jié)果進(jìn)行緩存,同時(shí)設(shè)置一個(gè)較短的過(guò)期時(shí)間。通過(guò)這個(gè)設(shè)置的默認(rèn)值存放到緩存,這樣第二次到緩存中獲取就有值了,而不會(huì)繼續(xù)訪問(wèn)數(shù)據(jù)庫(kù),可以防止有大量惡意請(qǐng)求是反復(fù)用同一個(gè)key進(jìn)行攻擊。
  • 使用布隆過(guò)濾器快速判斷數(shù)據(jù)是否存在。那什么是布隆過(guò)濾器呢,簡(jiǎn)單來(lái)說(shuō),就是可以引入了多個(gè)相互獨(dú)立的哈希函數(shù),保證在給定的空間和誤判率下,完成元素判重。

因?yàn)槲覀冎?,存在hash碰撞這樣一種情況,那如果只使用一個(gè)hash函數(shù),則碰撞沖突的概率明顯會(huì)變大,那為了減少這種沖突,我們可以多引入幾個(gè)hash函數(shù),而布隆過(guò)濾器算法的核心思想就是利用多個(gè)不同的hash函數(shù)來(lái)解決這樣一種沖突。它的優(yōu)點(diǎn)是空間效率高,查詢時(shí)間短,遠(yuǎn)超其他算法,而它的缺點(diǎn)就是會(huì)存在一定的誤識(shí)別率,它不能完全保證請(qǐng)求過(guò)來(lái)的key,通過(guò)布隆過(guò)濾器的校驗(yàn),就一定有這個(gè)數(shù)據(jù),畢竟理論上還是會(huì)存在沖突情況,無(wú)論概率多小。

但是,只要沒(méi)有通過(guò)布隆過(guò)濾器的校驗(yàn),那么這個(gè)key就一定不存在,只要利用這一點(diǎn)其實(shí)就已經(jīng)可以過(guò)濾掉大部分不存在的key的請(qǐng)求了,在正常場(chǎng)景下已然足夠了。

5. 其他

除了上述三種常見(jiàn)的Redis緩存異常問(wèn)題之外,還經(jīng)常聽(tīng)到的有緩存預(yù)熱和緩存降級(jí)兩個(gè)名詞,與其說(shuō)是異常問(wèn)題,不如說(shuō)是兩種的優(yōu)化處理方法。

(1) 緩存預(yù)熱

緩存預(yù)熱就是系統(tǒng)上線前后,將相關(guān)的緩存數(shù)據(jù)直接加載到緩存系統(tǒng)中去,而不依賴用戶。這樣就可以避免在用戶請(qǐng)求的時(shí)候,先查詢數(shù)據(jù)庫(kù),然后再將數(shù)據(jù)緩存的問(wèn)題。用戶直接查詢事先被預(yù)熱的緩存數(shù)據(jù),這樣可以避免那么系統(tǒng)上線初期,對(duì)于高并發(fā)的流量,都會(huì)訪問(wèn)到數(shù)據(jù)庫(kù)中, 對(duì)數(shù)據(jù)庫(kù)造成流量的壓力。根據(jù)數(shù)據(jù)不同量級(jí),可以有以下幾種做法:

  • 數(shù)據(jù)量不大:項(xiàng)目啟動(dòng)的時(shí)候自動(dòng)進(jìn)行加載。
  • 數(shù)據(jù)量較大:后臺(tái)定時(shí)刷新緩存。
  • 數(shù)據(jù)量極大:只針對(duì)熱點(diǎn)數(shù)據(jù)進(jìn)行預(yù)加載緩存操作。

(2) 緩存降級(jí)

緩存降級(jí)是指當(dāng)緩存失效或緩存服務(wù)出現(xiàn)問(wèn)題時(shí),為了防止緩存服務(wù)故障,導(dǎo)致數(shù)據(jù)庫(kù)跟著一起發(fā)生雪崩問(wèn)題,所以也不去訪問(wèn)數(shù)據(jù)庫(kù),但因?yàn)橐恍┰?,仍然想要保證服務(wù)還是基本可用的,雖然肯定會(huì)是有損服務(wù)。因此,對(duì)于不重要的緩存數(shù)據(jù),我們可以采取服務(wù)降級(jí)策略。一般做法有以下兩種:

  • 直接訪問(wèn)內(nèi)存部分的數(shù)據(jù)緩存。
  • 直接返回系統(tǒng)設(shè)置的默認(rèn)值。

6. 總結(jié)

本文主要對(duì)常見(jiàn)的Redis緩存異常及其處理方案進(jìn)行了總結(jié),可以用下圖做個(gè)概括:

責(zé)任編輯:趙寧寧 來(lái)源: IT168網(wǎng)站
相關(guān)推薦

2025-02-04 17:40:44

2018-11-12 12:12:15

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

2010-09-07 13:24:18

CSS

2022-03-09 23:28:31

Java開(kāi)發(fā)異常

2011-05-19 14:16:29

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

2011-06-13 10:05:31

Android

2009-08-21 11:39:58

C# Socket通信

2009-11-05 12:45:25

WCF異常

2018-05-30 08:10:34

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

2014-09-01 15:27:48

FTTH

2019-10-09 16:18:36

緩存架構(gòu)雪崩

2010-01-11 10:48:15

2011-10-18 10:36:13

云計(jì)算云存儲(chǔ)

2009-06-05 11:07:30

2019-04-23 08:42:42

EhcacheMemcacheRedis

2009-11-06 15:25:25

WCF異常

2015-11-05 11:20:14

2019-10-08 16:05:19

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

2012-09-20 14:58:47

2021-09-13 22:31:24

人工智能疫情技術(shù)
點(diǎn)贊
收藏

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