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