【Redis】Redis常見面試題(2)
【Redis】Redis常見面試題(2)
1. 緩存
緩存在計(jì)算機(jī)系統(tǒng)中有著重要的作用,它可以顯著提高系統(tǒng)的性能和響應(yīng)速度
- 提升系統(tǒng)性能: 緩存將常用的數(shù)據(jù)或計(jì)算結(jié)果存儲(chǔ)在高速的存儲(chǔ)介質(zhì)中,如內(nèi)存,以便快速地響應(yīng)請(qǐng)求。通過減少對(duì)慢速存儲(chǔ)介質(zhì)(如硬盤或數(shù)據(jù)庫)的訪問次數(shù),可以降低響應(yīng)延遲,提高系統(tǒng)的吞吐量和效率
- 減輕后端壓力: 通過緩存,系統(tǒng)可以減少對(duì)后端資源的頻繁訪問,降低數(shù)據(jù)庫或其他外部服務(wù)的負(fù)載。這樣可以節(jié)省計(jì)算資源,提高系統(tǒng)的可擴(kuò)展性和穩(wěn)定性
- 改善用戶體驗(yàn): 緩存能夠加速應(yīng)用程序的響應(yīng)速度,從而提供更好的用戶體驗(yàn)。用戶可以更快地獲取所需的數(shù)據(jù)或結(jié)果,減少等待時(shí)間,提高用戶滿意度
就以我們的大腦為例
-
5的階乘是120,一般不需要一直拆成
5*4*3*2*1
去算,而是直接答120,因?yàn)槲覀兇竽X吧5的階乘是120保存到“緩存”了! -
再比如,你是個(gè)數(shù)學(xué)白癡,四道選擇題一道不會(huì),但是你在測試之前看到了答案,答案是ABCD,你記住了,放在“緩存”里;測試的時(shí)候,你直接寫答案,四道選擇題滿分;下次遇到同樣的四道選擇題,題目和選項(xiàng)一模一樣,一些你還記得答案,但是一些忘記了,“忘記了”也就是“緩存的過期”
2. Redis作為緩存
由于Redis高性能,多種數(shù)據(jù)結(jié)構(gòu),持久化支持的特性,再加上天生支持分布式,作為分布式機(jī)的緩存,擔(dān)得起這個(gè)責(zé)任~
下面是Redis作為緩存常見的一些知識(shí)點(diǎn)
2.1 緩存雪崩
緩存雪崩是指在短時(shí)間內(nèi),由大量緩存同時(shí)過期,導(dǎo)致大量的請(qǐng)求直接訪問查詢數(shù)據(jù)庫而不是緩存,從而對(duì)數(shù)據(jù)庫造成巨大的壓力,嚴(yán)重的情況下可能會(huì)導(dǎo)致數(shù)據(jù)庫宕機(jī)!
緩存的存在,減少了請(qǐng)求訪問查詢數(shù)據(jù)庫的頻率,提高效率,減低數(shù)據(jù)庫壓力,過期后,“沒人兜底了”
正常情況下:
緩存雪崩:
解決:
-
加鎖排隊(duì),缺點(diǎn)就是增加系統(tǒng)的響應(yīng)時(shí)間,降低系統(tǒng)吞吐量,犧牲一點(diǎn)用戶體驗(yàn)
-
隨機(jī)化過期時(shí)間,極大避免了同時(shí)過期這個(gè)事件的發(fā)生,系統(tǒng)常用的方式;甚至可以不設(shè)置過期時(shí)間,但對(duì)硬件要求高
-
設(shè)計(jì)二級(jí)緩存,Redis這一層防線淪陷后,二級(jí)緩存挺身而出
2.2 緩存穿透
緩存穿透指的是查詢數(shù)據(jù)庫和緩存都沒有數(shù)據(jù),因?yàn)閿?shù)據(jù)庫查詢無數(shù)據(jù),出于容錯(cuò)考慮,不會(huì)將結(jié)果保存到緩存中,因此每次請(qǐng)求都會(huì)去查詢數(shù)據(jù)庫,這種情況就叫做緩存穿透
- 可以理解為每次都無視緩存,緩存一直沒被存數(shù)據(jù),緩存沒有其作用
2.3 緩存擊穿
緩存擊穿指的是某個(gè)熱點(diǎn)緩存,在某一時(shí)刻恰好失效了,然后此時(shí)剛好有大量的并發(fā)請(qǐng)求,此時(shí)這些請(qǐng)求將會(huì)給數(shù)據(jù)庫造成巨大的壓力
- 就像被擊穿了個(gè)洞,一個(gè)缺口,“流量大,水壓高”形成一道強(qiáng)硬的“水刀”刺向數(shù)據(jù)庫
- 而緩存雪崩則是水壩直接塌了,涌了下來
相比于緩存穿透,擊穿的嚴(yán)重程度顯然更高
解決方案:
- 加鎖排隊(duì)
- 設(shè)置永不過期,既然是熱點(diǎn)緩存,它配永不過期!
2.4 緩存雪崩、緩存穿透、緩存擊穿的區(qū)別
-
緩存穿透是因?yàn)橐恢睕]有緩存數(shù)據(jù)導(dǎo)致的問題
-
緩存擊穿是因?yàn)槟硞€(gè)熱點(diǎn)緩存失效而導(dǎo)致的問題
-
緩存血本是因?yàn)橥瑫r(shí)又大量的緩存失效所帶來的問題
2.5 緩存預(yù)熱
是一個(gè)優(yōu)化手段,就是應(yīng)用程序啟動(dòng)或緩存失效之后,主動(dòng)將熱點(diǎn)數(shù)據(jù)加載到緩存中的策略
- 這樣,在實(shí)際請(qǐng)求到達(dá)應(yīng)用程序時(shí),熱點(diǎn)數(shù)據(jù)已經(jīng)存在于緩存中,從而減少了緩存未命中的情況,提高了應(yīng)用程序的響應(yīng)速度
2.6 如何保證緩存和MySQL雙寫一致
可以采用以下幾種方法:
-
讀取優(yōu)先
- 在讀取數(shù)據(jù)時(shí),優(yōu)先從Redis緩存中讀取,如果緩存中不存在,則從MySQL數(shù)據(jù)庫讀取,并將數(shù)據(jù)寫入Redis緩存。這樣可以確保讀取到的數(shù)據(jù)都是最新的,避免緩存中的臟數(shù)據(jù)
-
更新同步
- 在更新數(shù)據(jù)時(shí),先更新MySQL數(shù)據(jù)庫,然后再更新Redis緩存。這樣可以避免數(shù)據(jù)庫和緩存中的數(shù)據(jù)不一致
-
使用隊(duì)列
- 通過將更新操作寫入隊(duì)列中,然后異步地從隊(duì)列中獲取操作并依次執(zhí)行更新操作,先更新MySQL數(shù)據(jù)庫,然后再更新Redis緩存。這樣可以保證更新操作的順序一致性,并減少數(shù)據(jù)庫和緩存的并發(fā)寫入沖突
-
使用事務(wù)
- 在支持事務(wù)的數(shù)據(jù)庫中,可以使用數(shù)據(jù)庫事務(wù)來同時(shí)更新MySQL和Redis。當(dāng)更新MySQL數(shù)據(jù)庫時(shí),在同一個(gè)事務(wù)中也更新Redis緩存。如果更新Redis緩存失敗,可以回滾數(shù)據(jù)庫事務(wù),確保數(shù)據(jù)的一致性。
-
定時(shí)刷新
- 設(shè)置一個(gè)定時(shí)任務(wù),在一定時(shí)間間隔內(nèi)將MySQL數(shù)據(jù)庫中的數(shù)據(jù)同步到Redis緩存中,保持?jǐn)?shù)據(jù)的一致性??梢愿鶕?jù)業(yè)務(wù)需求設(shè)置合適的刷新時(shí)間間隔
需要注意的是,以上方法會(huì)增加系統(tǒng)的復(fù)雜性和延遲文章來源:http://www.zghlxwxcb.cn/news/detail-709409.html
- 因此需要根據(jù)具體的業(yè)務(wù)場景和性能要求做出權(quán)衡和選擇
- 另外,使用緩存和數(shù)據(jù)庫作為雙寫一致性解決方案時(shí),也需要考慮緩存和數(shù)據(jù)庫的高可用性和容錯(cuò)機(jī)制,以確保整個(gè)系統(tǒng)的可靠性
文章到此結(jié)束!謝謝觀看
可以叫我 小馬,我可能寫的不好或者有錯(cuò)誤,但是一起加油鴨??!文章來源地址http://www.zghlxwxcb.cn/news/detail-709409.html
到了這里,關(guān)于【Redis】Redis作為緩存的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!