大家好叹洲,我是漫步coding, 最近在整理2022年Redis最新面試題, 大家也可以通過我下面的博客地址在線閱讀,今天講講第8篇 - Redis緩存問題闸溃。本文首發(fā)于公眾號:漫步coding
2022年Redis最新面試題目錄
- Redis基礎(chǔ)知識
- Redis數(shù)據(jù)結(jié)構(gòu)
- Redis事務(wù)
- Redis數(shù)據(jù)持久化
- Redis集群
- Redis淘汰策略
- Redis分布式鎖
- Redis緩存問題
緩存問題
- 分布式緩存
- Redis緩存雪崩
- Redis緩存擊穿
- Redis緩存穿透
- 緩存預(yù)熱
- 緩存降級
Redis緩存雪崩
出現(xiàn)概率: ★★★★★
這個在Redis面試的題目中算是出鏡率特別高的問題了, 建議仔細(xì)消化一下堵泽。
1)厅贪、緩存雪崩是指<font color=#FF000 >大量的緩存key</font>無法在Redis緩存中進(jìn)行處理,緊接著竖螃,<font color=#FF000 >短時間大量請求直接打到數(shù)據(jù)庫層</font>记舆,導(dǎo)致數(shù)據(jù)庫層的壓力激增, 可能瞬間就會導(dǎo)致數(shù)據(jù)庫宕機(jī)。
緩存雪崩一般是由兩個原因?qū)е碌牡树蓿瑧?yīng)對方案也有所不同茁肠,我們一個個來看。
第一個原因是:緩存中有大量數(shù)據(jù)同時過期缩举,比如說一些APP首頁緩存數(shù)據(jù)垦梆,都設(shè)置了當(dāng)天有效, 凌晨過期仅孩, 在第二天流量高峰時, 大量用戶訪問的請求托猩, 沒有換成從數(shù)據(jù)庫中讀取數(shù)據(jù)。如果應(yīng)用的并發(fā)請求量很大辽慕,那么數(shù)據(jù)庫的壓力也突然變得很大京腥,可能會造成緩存雪崩。
這種類似的問題解決思路也基本簡單, 打散過期時間, 比如設(shè)置過期時間為 24小時之后 + 隨機(jī)N分鐘溅蛉。
另外一個原因是Redis宕機(jī), 這個就需要分析Redis宕機(jī)的原因了公浪, 是因為磁盤滿了還是內(nèi)存滿了, 根據(jù)情況進(jìn)行處理,或者升配置什么的温艇。
如果是內(nèi)存滿了, 也需要考慮是不是緩存過期回收策略的問題因悲。
Redis緩存擊穿
出現(xiàn)概率: ★★★★
緩存擊穿跟緩存雪崩有點(diǎn)類似,緩存雪崩是大規(guī)模的key失效勺爱,而<font color=#FF000 >緩存擊穿是某個熱點(diǎn)的key失效</font>晃琳,大并發(fā)集中對其進(jìn)行請求,就會造成大量請求讀緩存沒讀到數(shù)據(jù),從而導(dǎo)致高并發(fā)訪問數(shù)據(jù)庫卫旱,引起數(shù)據(jù)庫壓力劇增人灼。這種現(xiàn)象就叫做緩存擊穿。
解決方案:
a)顾翼、在緩存失效后投放,通過互斥鎖或者隊列來控制讀數(shù)據(jù)寫緩存的線程數(shù)量,比如某個key只允許一個線程查詢數(shù)據(jù)和寫緩存适贸,其他線程等待灸芳。這種方式會阻塞其他的線程,此時系統(tǒng)的吞吐量會下降
b)拜姿、熱點(diǎn)數(shù)據(jù)緩存永遠(yuǎn)不過期烙样。
永不過期實際包含兩層意思:
物理不過期,針對熱點(diǎn)key不設(shè)置過期時間
邏輯過期蕊肥,把過期時間存在key對應(yīng)的value里谒获,如果發(fā)現(xiàn)要過期了,通過一個后臺的異步線程進(jìn)行緩存的構(gòu)建
Redis緩存穿透
出現(xiàn)概率: ★★★★
緩存穿透是指用戶請求的數(shù)據(jù)在<font color=#FF000 >緩存中不存在即沒有命中壁却,同時在數(shù)據(jù)庫中也不存在</font>批狱,導(dǎo)致用戶每次請求該數(shù)據(jù)都要去數(shù)據(jù)庫中查詢一遍。
如果短時間大量類似請求落在數(shù)據(jù)庫上展东,造成數(shù)據(jù)庫壓力過大赔硫,可能導(dǎo)致數(shù)據(jù)庫承受不住而宕機(jī)崩潰。
解決方法:
a)琅锻、將無效的key存放進(jìn)Redis中:
當(dāng)出現(xiàn)Redis查不到數(shù)據(jù)卦停,數(shù)據(jù)庫也查不到數(shù)據(jù)的情況,我們就把這個key保存到Redis中恼蓬,設(shè)置value="null"惊完,并設(shè)置其過期時間極短,后面再出現(xiàn)查詢這個key的請求的時候处硬,直接返回null小槐,就不需要再查詢數(shù)據(jù)庫了。但這種處理方式是有問題的荷辕,假如傳進(jìn)來的這個不存在的Key值每次都是隨機(jī)的凿跳,那存進(jìn)Redis也沒有意義。
b)疮方、使用布隆過濾器:
如果布隆過濾器判定某個 key 不存在布隆過濾器中控嗜,那么就一定不存在,如果判定某個 key 存在骡显,那么很大可能是存在(存在一定的誤判率)疆栏。于是我們可以在緩存之前再加一個布隆過濾器曾掂,將數(shù)據(jù)庫中的所有key都存儲在布隆過濾器中,在查詢Redis前先去布隆過濾器查詢 key 是否存在壁顶,如果不存在就直接返回珠洗,不讓其訪問數(shù)據(jù)庫,從而避免了對底層存儲系統(tǒng)的查詢壓力若专。
Redis緩存預(yù)熱
出現(xiàn)概率: ★★★
緩存預(yù)熱如字面意思许蓖,當(dāng)系統(tǒng)上線時,緩存內(nèi)還沒有數(shù)據(jù)调衰,如果直接提供給用戶使用膊爪,每個請求都會穿過緩存去訪問底層數(shù)據(jù)庫,如果并發(fā)大的話窖式,很有可能在上線當(dāng)天就會宕機(jī)蚁飒,因此我們需要在上線前先將數(shù)據(jù)庫內(nèi)的熱點(diǎn)數(shù)據(jù)緩存至Redis內(nèi)再提供出去使用,這種操作就成為"緩存預(yù)熱"萝喘。
緩存預(yù)熱的實現(xiàn)方式有很多,比較通用的方式是寫個批任務(wù)琼懊,在啟動項目時或定時去觸發(fā)將底層數(shù)據(jù)庫內(nèi)的熱點(diǎn)數(shù)據(jù)加載到緩存內(nèi)阁簸。
Redis緩存降級
出現(xiàn)概率: ★★★
緩存降級是指當(dāng)訪問量劇增、服務(wù)出現(xiàn)問題(如響應(yīng)時間慢或不響應(yīng))或非核心服務(wù)影響到核心流程的性能時哼丈,即使是有損部分其他服務(wù)启妹,仍然需要保證主服務(wù)可用∽淼可以將其他次要服務(wù)的數(shù)據(jù)進(jìn)行緩存降級饶米,從而提升主服務(wù)的穩(wěn)定性。
降級的目的是保證核心服務(wù)可用车胡,即使是有損的檬输。如去年雙十一的時候淘寶購物車無法修改地址只能使用默認(rèn)地址,這個服務(wù)就是被降級了匈棘,這里阿里保證了訂單可以正常提交和付款丧慈,但修改地址的服務(wù)可以在服務(wù)器壓力降低,并發(fā)量相對減少的時候再恢復(fù)主卫。
也歡迎關(guān)注我的公眾號: 漫步coding
逃默。 一起交流, 在coding的世界里漫步, 回復(fù): <font color=#FF000 >redis
</font>, 免費(fèi)獲取最新Redis面試題(含答案)。