如何讓面試官覺得你對redis有較深入的理解以及較強(qiáng)的實(shí)戰(zhàn)經(jīng)驗(yàn)?這一篇為你解惑。
0.redis是什么?
redis是nosql(也是個(gè)巨大的map) 單線程,但是可處理1秒10w的并發(fā)(數(shù)據(jù)都在內(nèi)存中)
使用java對redis進(jìn)行操作類似jdbc接口標(biāo)準(zhǔn)對mysql,有各類實(shí)現(xiàn)他的實(shí)現(xiàn)類,我們常用的是druid
其中對redis,我們通常用Jedis(也為我們提供了連接池JedisPool)
在redis中,key就是byte[](string)
redis的數(shù)據(jù)結(jié)構(gòu)(value):
String,list,set,orderset,hash
每種數(shù)據(jù)結(jié)構(gòu)對應(yīng)不同的命令語句~
加群即可獲取 群號:680075317?即可獲取Java工程化、高性能及分布式、高性能、高架構(gòu)、性能調(diào)優(yōu)、Spring、MyBatis、Netty源碼分析等多個(gè)知識點(diǎn)高級進(jìn)階干貨的相關(guān)視頻資料,還有spring和虛擬機(jī)等書籍掃描版,還有更多面試題,等你來拿
1.redis怎么使用?
先安裝好redis,然后運(yùn)行,在pom文件中引入依賴,在要使用redis緩存的類的mapper.xml文件配置redis的全限定名。引入redis的redis.properties文件(如果要更改配置就可以使用)
2.應(yīng)用場景:
String :
1存儲json類型對象,2計(jì)數(shù)器,3優(yōu)酷視頻點(diǎn)贊等
list(雙向鏈表)
1可以使用redis的list模擬隊(duì)列,堆,棧
2朋友圈點(diǎn)贊(一條朋友圈內(nèi)容語句,若干點(diǎn)贊語句)
規(guī)定:朋友圈內(nèi)容的格式:
1,內(nèi)容: user:x:post:x content來存儲;
2,點(diǎn)贊: post:x:good list來存儲;(把相應(yīng)頭像取出來顯示)
hash(hashmap)
1保存對象
2分組
2
3.為什么redis是單線程的都那么快?
1.數(shù)據(jù)存于內(nèi)存
2.用了多路復(fù)用I/O
3.單線程
5.redis也可以進(jìn)行發(fā)布訂閱消息嗎?
可以,(然后可以引出哨兵模式(后面會講)怎么互相監(jiān)督的,就是因?yàn)槊扛?秒哨兵節(jié)點(diǎn)會發(fā)布對某節(jié)點(diǎn)的判斷和自身的信息到某頻道,每個(gè)哨兵訂閱該頻道獲取其他哨兵節(jié)點(diǎn)和主從節(jié)點(diǎn)的信息,以達(dá)到哨兵間互相監(jiān)控和對主從節(jié)點(diǎn)的監(jiān)控)和很多專業(yè)的消息隊(duì)列系統(tǒng)(例如Kafka、RocketMQ)相比,Redis的發(fā)布訂閱略顯粗糙,例如無法實(shí)現(xiàn)消息堆積和回溯。但勝在足夠簡單。
6.redis能否將數(shù)據(jù)持久化,如何實(shí)現(xiàn)?
能,將內(nèi)存中的數(shù)據(jù)異步寫入硬盤中,兩種方式:RDB(默認(rèn))和AOF
RDB持久化原理:通過bgsave命令觸發(fā),然后父進(jìn)程執(zhí)行fork操作創(chuàng)建子進(jìn)程,子進(jìn)程創(chuàng)建RDB文件,根據(jù)父進(jìn)程內(nèi)存生成臨時(shí)快照文件,完成后對原有文件進(jìn)行原子替換(定時(shí)一次性將所有數(shù)據(jù)進(jìn)行快照生成一份副本存儲在硬盤中)
優(yōu)點(diǎn):是一個(gè)緊湊壓縮的二進(jìn)制文件,Redis加載RDB恢復(fù)數(shù)據(jù)遠(yuǎn)遠(yuǎn)快于AOF的方式。
缺點(diǎn):由于每次生成RDB開銷較大,非實(shí)時(shí)持久化,
加群即可獲取 群號:680075317?即可獲取Java工程化、高性能及分布式、高性能、高架構(gòu)、性能調(diào)優(yōu)、Spring、MyBatis、Netty源碼分析等多個(gè)知識點(diǎn)高級進(jìn)階干貨的相關(guān)視頻資料,還有spring和虛擬機(jī)等書籍掃描版,還有更多面試題,等你來拿
AOF持久化原理:開啟后,Redis每執(zhí)行一個(gè)修改數(shù)據(jù)的命令,都會把這個(gè)命令添加到AOF文件中。
優(yōu)點(diǎn):實(shí)時(shí)持久化。
缺點(diǎn):所以AOF文件體積逐漸變大,需要定期執(zhí)行重寫操作來降低文件體積,加載慢
7.主從復(fù)制模式下,主掛了怎么辦?redis提供了哨兵模式(高可用)
何謂哨兵模式?就是通過哨兵節(jié)點(diǎn)進(jìn)行自主監(jiān)控主從節(jié)點(diǎn)以及其他哨兵節(jié)點(diǎn),發(fā)現(xiàn)主節(jié)點(diǎn)故障時(shí)自主進(jìn)行故障轉(zhuǎn)移。
8.哨兵模式實(shí)現(xiàn)原理?(2.8版本或更高才有)
1.三個(gè)定時(shí)監(jiān)控任務(wù):
1.1 每隔10s,每個(gè)S節(jié)點(diǎn)(哨兵節(jié)點(diǎn))會向主節(jié)點(diǎn)和從節(jié)點(diǎn)發(fā)送info命令獲取最新的拓?fù)浣Y(jié)構(gòu)
1.2 每隔2s,每個(gè)S節(jié)點(diǎn)會向某頻道上發(fā)送該S節(jié)點(diǎn)對于主節(jié)點(diǎn)的判斷以及當(dāng)前Sl節(jié)點(diǎn)的信息,
同時(shí)每個(gè)Sentinel節(jié)點(diǎn)也會訂閱該頻道,來了解其他S節(jié)點(diǎn)以及它們對主節(jié)點(diǎn)的判斷(做客觀下線依據(jù))
1.3 每隔1s,每個(gè)S節(jié)點(diǎn)會向主節(jié)點(diǎn)、從節(jié)點(diǎn)、其余S節(jié)點(diǎn)發(fā)送一條ping命令做一次心跳檢測(心跳檢測機(jī)制),來確認(rèn)這些節(jié)點(diǎn)當(dāng)前是否可達(dá)
2.主客觀下線:
2.1主觀下線:根據(jù)第三個(gè)定時(shí)任務(wù)對沒有有效回復(fù)的節(jié)點(diǎn)做主觀下線處理
2.2客觀下線:若主觀下線的是主節(jié)點(diǎn),會咨詢其他S節(jié)點(diǎn)對該主節(jié)點(diǎn)的判斷,超過半數(shù),對該主節(jié)點(diǎn)做客觀下線
3.選舉出某一哨兵節(jié)點(diǎn)作為領(lǐng)導(dǎo)者,來進(jìn)行故障轉(zhuǎn)移。選舉方式:raft算法。每個(gè)S節(jié)點(diǎn)有一票同意權(quán),哪個(gè)S節(jié)點(diǎn)做出主觀下線的時(shí)候,就會詢問其他S節(jié)點(diǎn)是否同意其為領(lǐng)導(dǎo)者。獲得半數(shù)選票的則成為領(lǐng)導(dǎo)者?;菊l先做出客觀下線,誰成為領(lǐng)導(dǎo)者。
4.故障轉(zhuǎn)移(選舉新主節(jié)點(diǎn)流程):
.
9.redis集群(采用虛擬槽方式,高可用)原理(和哨兵模式原理類似,3.0版本或以上才有)?
1.Redis集群內(nèi)節(jié)點(diǎn)通過ping/pong消息實(shí)現(xiàn)節(jié)點(diǎn)通信,消息不但可以傳播節(jié)點(diǎn)槽信息,還可以傳播其他狀態(tài)如:主從狀態(tài)、節(jié)點(diǎn)故障等。因此故障發(fā)現(xiàn)也是通過消息傳播機(jī)制實(shí)現(xiàn)的,主要環(huán)節(jié)包括:主觀下線(pfail)和客觀下線(fail)
2.主客觀下線:
2.1主觀下線:集群中每個(gè)節(jié)點(diǎn)都會定期向其他節(jié)點(diǎn)發(fā)送ping消息,接收節(jié)點(diǎn)回復(fù)pong消息作為響應(yīng)。如果通信一直失敗,則發(fā)送節(jié)點(diǎn)會把接收節(jié)點(diǎn)標(biāo)記為主觀下線(pfail)狀態(tài)。
2.2客觀下線:超過半數(shù),對該主節(jié)點(diǎn)做客觀下線
3.主節(jié)點(diǎn)選舉出某一主節(jié)點(diǎn)作為領(lǐng)導(dǎo)者,來進(jìn)行故障轉(zhuǎn)移。
4.故障轉(zhuǎn)移(選舉從節(jié)點(diǎn)作為新主節(jié)點(diǎn))
10.緩存更新策略(即如何讓緩存和mysql保持一致性)?
10.1 key過期清除(超時(shí)剔除)策略
惰性過期(類比懶加載,這是懶過期):只有當(dāng)訪問一個(gè)key時(shí),才會判斷該key是否已過期,過期則清除。該策略可以最大化地節(jié)省CPU資源,卻對內(nèi)存非常不友好。極端情況可能出現(xiàn)大量的過期key沒有再次被訪問,從而不會被清除,占用大量內(nèi)存。
定期過期:每隔一定的時(shí)間,會掃描一定數(shù)量的數(shù)據(jù)庫的expires字典中一定數(shù)量的key,并清除其中已過期的key。該策略是前兩者的一個(gè)折中方案。通過調(diào)整定時(shí)掃描的時(shí)間間隔和每次掃描的限定耗時(shí),可以在不同情況下使得CPU和內(nèi)存資源達(dá)到最優(yōu)的平衡效果。
(expires字典會保存所有設(shè)置了過期時(shí)間的key的過期時(shí)間數(shù)據(jù),其中,key是指向鍵空間中的某個(gè)鍵的指針,value是該鍵的毫秒精度的UNIX時(shí)間戳表示的過期時(shí)間。鍵空間是指該Redis集群中保存的所有鍵。)
問:比如這么個(gè)場景,我設(shè)計(jì)了很多key,過期時(shí)間是5分鐘,當(dāng)前內(nèi)存占用率是50%。但是5分鐘到了,內(nèi)存占用率還是很高,請問為什么?
Redis中同時(shí)使用了惰性過期和定期過期兩種過期策略,即使過期時(shí)間到了,但是有部分并沒有真正刪除,等待惰性刪除。
為什么有定期還要有惰性呢?其實(shí)很簡單,比如10萬個(gè)key就要過期了,Redis默認(rèn)是100ms檢查一波。如果他檢查出10萬個(gè)即將要清除,那他接下來的時(shí)間基本都是在干這些清空內(nèi)存的事了,那肯定影響性能,所以他只會部分刪除,剩下的等惰性
10.2 Redis的內(nèi)存淘汰策略
Redis的內(nèi)存淘汰策略是指在Redis的用于緩存的內(nèi)存不足時(shí),怎么處理需要新寫入且需要申請額外空間的數(shù)據(jù)。
noeviction:當(dāng)內(nèi)存不足以容納新寫入數(shù)據(jù)時(shí),新寫入操作會報(bào)錯。
allkeys-lru:當(dāng)內(nèi)存不足以容納新寫入數(shù)據(jù)時(shí),在鍵空間中,移除最近最少使用的key。
allkeys-random:當(dāng)內(nèi)存不足以容納新寫入數(shù)據(jù)時(shí),在鍵空間中,隨機(jī)移除某個(gè)key。
volatile-lru:當(dāng)內(nèi)存不足以容納新寫入數(shù)據(jù)時(shí),在設(shè)置了過期時(shí)間的鍵空間中,移除最近最少使用的key。
volatile-random:當(dāng)內(nèi)存不足以容納新寫入數(shù)據(jù)時(shí),在設(shè)置了過期時(shí)間的鍵空間中,隨機(jī)移除某個(gè)key。
volatile-ttl:當(dāng)內(nèi)存不足以容納新寫入數(shù)據(jù)時(shí),在設(shè)置了過期時(shí)間的鍵空間中,有更早過期時(shí)間的key優(yōu)先移除。
11.緩存粒度控制?
12.如何防止緩存穿透?
(緩存穿透指的是查詢一個(gè)根本不存在的數(shù)據(jù),緩存層和存儲層都不會命中,但是這樣對存儲層壓力較大,若是惡意攻擊,壓力更大)
12.1:緩存空值存在的問題:
12.2:布隆過濾器:
布隆過濾器存在的問題:相對來說布隆過濾器搞起來代碼還是比較復(fù)雜的,現(xiàn)階段我們暫時(shí)還不需要,后面實(shí)在需要再考慮去做,什么階段做什么樣的事情,不是說這個(gè)系統(tǒng)一下子就能做的各種完美。
13.無底洞優(yōu)化?
造成原因:redis分布式越來越多,導(dǎo)致性能反而下降,因?yàn)殒I值分布到更多的 節(jié)點(diǎn)上,所以無論是Memcache還是Redis的分布式,批量操作通常需要從不 同節(jié)點(diǎn)上獲取,相比于單機(jī)批量操作只涉及一次網(wǎng)絡(luò)操作,分布式批量操作 會涉及多次網(wǎng)絡(luò)時(shí)間。 即分布式過猶不及。
14.雪崩優(yōu)化
如果緩存層由于某些原因不能提供服務(wù),于是所有的請求都會達(dá)到存儲層,存儲層的調(diào)用量會暴增,造成存儲層也會級聯(lián)宕機(jī)的情況。
15.熱點(diǎn)key優(yōu)化
當(dāng)前key是一個(gè)熱點(diǎn)key(例如一個(gè)熱門的娛樂新聞),并發(fā)量非常大。
最后送福利了,加群即可獲取 群號:680075317 即可獲取Java工程化、高性能及分布式、高性能、高架構(gòu)、性能調(diào)優(yōu)、Spring、MyBatis、Netty源碼分析等多個(gè)知識點(diǎn)高級進(jìn)階干貨的相關(guān)視頻資料,還有spring和虛擬機(jī)等書籍掃描版,還有更多面試題,等你來拿