Redis是一種非關(guān)系型數(shù)據(jù)庫(kù),它是一種Key-Value存儲(chǔ)系統(tǒng)。類似于memcached,但與memcached不同的是,Redis支持更為豐富的數(shù)據(jù)結(jié)構(gòu),例如hashes、lists、sets、sorted sets等。同時(shí),Redis支持多種數(shù)據(jù)持久化方式,非常適合用來(lái)做緩存系統(tǒng),尤其是高并發(fā)的互聯(lián)網(wǎng)應(yīng)用中。在Redis中,對(duì)于一些頻繁讀取但又不容易修改的數(shù)據(jù)可以將其緩存在內(nèi)存中,以此提高系統(tǒng)的查詢性能,也就是所謂的緩存。
Redis緩存穿透
緩存穿透是指訪問(wèn)一個(gè)不存在的緩存對(duì)象,此時(shí)會(huì)直接請(qǐng)求數(shù)據(jù)庫(kù),如果這樣的行為頻繁發(fā)生,會(huì)導(dǎo)致數(shù)據(jù)庫(kù)的壓力過(guò)大,從而影響系統(tǒng)的性能和穩(wěn)定性。根據(jù)經(jīng)驗(yàn),在訪問(wèn)緩存時(shí),可以通過(guò)對(duì)key進(jìn)行校驗(yàn)已達(dá)到避免訪問(wèn)不存在的緩存數(shù)據(jù)的目的。例如,可以設(shè)置一個(gè)布隆過(guò)濾器(BloomFilter)來(lái)緩存數(shù)百萬(wàn)條數(shù)據(jù)的key,以此來(lái)避免請(qǐng)求緩存中不存在的key。這種解決方法能夠有效地解決緩存穿透問(wèn)題,大大降低了對(duì)數(shù)據(jù)庫(kù)的訪問(wèn)頻率。
Redis緩存擊穿和雪崩
緩存擊穿是指在高并發(fā)的情況下,大量的請(qǐng)求同時(shí)訪問(wèn)一些需要頻繁查詢并且緩存時(shí)間較短的緩存數(shù)據(jù),這時(shí)如果緩存數(shù)據(jù)剛好過(guò)期,那么所有的請(qǐng)求都會(huì)直接訪問(wèn)數(shù)據(jù)庫(kù),對(duì)數(shù)據(jù)庫(kù)造成巨大壓力,從而引起系統(tǒng)的崩潰。而緩存雪崩則是指當(dāng)緩存中的大量數(shù)據(jù)同時(shí)過(guò)期,所有請(qǐng)求都會(huì)直接反問(wèn)數(shù)據(jù)庫(kù),使得數(shù)據(jù)庫(kù)負(fù)載過(guò)高,系統(tǒng)無(wú)法正常運(yùn)行,也會(huì)導(dǎo)致系統(tǒng)的崩潰。
一種有效的預(yù)防方法是,對(duì)于熱點(diǎn)數(shù)據(jù),可以采取加鎖操作來(lái)保障并發(fā)控制。例如在調(diào)用方法時(shí),維護(hù)一個(gè)正在處理的緩存數(shù)據(jù)集合,當(dāng)有線程訪問(wèn)的時(shí)候,先判斷緩存中是否有數(shù)據(jù),如果有,直接返回,如果沒(méi)有,則加鎖,從數(shù)據(jù)庫(kù)中查詢數(shù)據(jù)后在加入緩存,釋放鎖。這種方式可以保證在高并發(fā)情況下,只有一個(gè)請(qǐng)求能夠去數(shù)據(jù)庫(kù)中查詢數(shù)據(jù),從而預(yù)防緩存擊穿和緩存雪崩。