Redis常見(jiàn)面試題
一、memcached與redis的區(qū)別?
1.存儲(chǔ)方式不同。memcached把數(shù)據(jù)全部存在內(nèi)存之中,斷電之后會(huì)掛掉,而redis雖然也用到了內(nèi)存,但是會(huì)有部分?jǐn)?shù)據(jù)存在硬盤(pán)中,保證數(shù)據(jù)持久性。
2.數(shù)據(jù)支持類型不同。memcached對(duì)數(shù)據(jù)支持比較簡(jiǎn)單,而redis支持?jǐn)?shù)據(jù)類型較豐富,如string、list、set、sorted set、hash。
3.底層實(shí)現(xiàn)不同。一般調(diào)用系統(tǒng)函數(shù),會(huì)消耗比較多的時(shí)間去請(qǐng)求,redis自己構(gòu)建了vm,速度會(huì)更快。
二、redis數(shù)據(jù)的淘汰策略?
1.volatile-lru:從已經(jīng)設(shè)置過(guò)期時(shí)間的數(shù)據(jù)集中,挑選最近最少使用的數(shù)據(jù)淘汰。
2.volatile-ttl:從已經(jīng)設(shè)置過(guò)期時(shí)間的數(shù)據(jù)集中,挑選即將要過(guò)期的數(shù)據(jù)淘汰。
3.volatile-random:從已經(jīng)設(shè)置過(guò)期時(shí)間的數(shù)據(jù)集中,隨機(jī)挑選數(shù)據(jù)淘汰。
4.allkeys-lru:從所有的數(shù)據(jù)集中,挑選最近最少使用的數(shù)據(jù)淘汰。
5.allkeys-random:從所有的數(shù)據(jù)集中,隨機(jī)挑選數(shù)據(jù)淘汰。
6。no-enviction:禁止淘汰數(shù)據(jù)。
三、為什么redis把所有數(shù)據(jù)都放到內(nèi)存中?
redis為了達(dá)到最快的讀寫(xiě)速度,將數(shù)據(jù)都讀到內(nèi)存中,并通過(guò)異步的方式將數(shù)據(jù)寫(xiě)入磁盤(pán)。如果不將數(shù)據(jù)放在內(nèi)存中,磁盤(pán)IO速度會(huì)嚴(yán)重影響redis的性能。
四、redis的并發(fā)競(jìng)爭(zhēng)問(wèn)題如何解決?
首先redis為單進(jìn)程單線程模式,采用隊(duì)列模式將并發(fā)訪問(wèn)變?yōu)榇性L問(wèn)。redis本身時(shí)沒(méi)有鎖的概念的,redis對(duì)多個(gè)客戶端連接并不存在競(jìng)爭(zhēng),但是在Jedis客戶端對(duì)redis進(jìn)行并發(fā)訪問(wèn)時(shí)會(huì)產(chǎn)生一系列問(wèn)題,這些問(wèn)題時(shí)由于客戶端連接混亂造成的。有兩種方案解決。
1.在客戶端,對(duì)連接進(jìn)行池化,同時(shí)對(duì)客戶端讀寫(xiě)redis操作采用內(nèi)部鎖synchronized。
2.在服務(wù)器角度,利用setnx實(shí)現(xiàn)鎖。
五、redis過(guò)期鍵的刪除策略?
1.定時(shí)刪除:在設(shè)置鍵的過(guò)期時(shí)間的同時(shí),創(chuàng)建一個(gè)timer,讓定時(shí)器在鍵的過(guò)期時(shí)間到達(dá)時(shí),立即執(zhí)行對(duì)鍵的刪除操作。(主動(dòng)刪除)
對(duì)內(nèi)存友好,但是對(duì)cpu時(shí)間不友好,有較多過(guò)期鍵的而情況下,刪除過(guò)期鍵會(huì)占用相當(dāng)一部分cpu時(shí)間。
2.惰性刪除:放任過(guò)期鍵不管,但是每次從鍵空間中獲取鍵時(shí),都檢查取到的鍵是否過(guò)去,如果過(guò)期就刪除,如果沒(méi)過(guò)期就返回該鍵。(被動(dòng)刪除)
對(duì)cpu時(shí)間友好,程序只會(huì)在取出鍵的時(shí)候才會(huì)對(duì)鍵進(jìn)行過(guò)期檢查,這不會(huì)在刪除其他無(wú)關(guān)過(guò)期鍵上花費(fèi)任何cpu時(shí)間,但是如果一個(gè)鍵已經(jīng)過(guò)期,而這個(gè)鍵又保留在數(shù)據(jù)庫(kù)中,那么只要這個(gè)過(guò)期鍵不被刪除,他所占用的內(nèi)存就不會(huì)釋放,對(duì)內(nèi)存不友好。
3.定期刪除:每隔一段時(shí)間就對(duì)數(shù)據(jù)庫(kù)進(jìn)行一次檢查,刪除里面的過(guò)期鍵。(主動(dòng)刪除)
采用對(duì)內(nèi)存和cpu時(shí)間折中的方法,每個(gè)一段時(shí)間執(zhí)行一次刪除過(guò)期鍵操作,并通過(guò)限制操作執(zhí)行的時(shí)長(zhǎng)和頻率來(lái)減少對(duì)cpu時(shí)間的影響。難點(diǎn)在于,選擇一個(gè)好的策略來(lái)設(shè)置刪除操作的時(shí)長(zhǎng)和執(zhí)行頻率。
六、redis與一般db的同步過(guò)程?
有兩種方式。
第一種,先去redis中判斷數(shù)據(jù)是否存在,如果存在,則直接返回緩存好的數(shù)據(jù),如果不存在,去db中讀取數(shù)據(jù),并把數(shù)據(jù)緩存一份到redis中。適用與數(shù)據(jù)里比較大,但是不經(jīng)常更新的情況,如用戶排行。
第二種,先去redis中判斷數(shù)據(jù)是否存在,如果存在,則直接更新對(duì)應(yīng)數(shù)據(jù)(這一步會(huì)記錄下更新的key,并把更新后的數(shù)據(jù)返回給頁(yè)面,如果不存在,先去數(shù)據(jù)庫(kù)中更新內(nèi)容,然后把數(shù)據(jù)保存一份到redis中。再往后,后臺(tái)會(huì)進(jìn)行一系列操作,把redis中更新的key讀取出來(lái),找到數(shù)據(jù)庫(kù)中對(duì)應(yīng)的數(shù)據(jù),并更新數(shù)據(jù)庫(kù)。這種方式是把redis當(dāng)作數(shù)據(jù)庫(kù)使用,適合大數(shù)據(jù)的頻繁變動(dòng)。但是對(duì)redis的依賴很大,要做好掛掉之后的數(shù)據(jù)備份。
七、簡(jiǎn)述redis的哨兵模式
哨兵是對(duì)redis進(jìn)行實(shí)時(shí)的監(jiān)控,主要有兩個(gè)功能。
1.監(jiān)測(cè)主數(shù)據(jù)庫(kù)和從數(shù)據(jù)庫(kù)是否正常運(yùn)行。2.當(dāng)主數(shù)據(jù)庫(kù)出現(xiàn)故障的時(shí)候,可以自動(dòng)將一個(gè)從數(shù)據(jù)庫(kù)轉(zhuǎn)換為主數(shù)據(jù)庫(kù),實(shí)現(xiàn)自動(dòng)切換。
八、redis的哨兵的監(jiān)控機(jī)制是怎樣的?
哨兵監(jiān)控也是有集群的,會(huì)有多個(gè)哨兵進(jìn)行監(jiān)控,當(dāng)判斷發(fā)生故障的哨兵達(dá)到一定數(shù)量的時(shí)候才進(jìn)行修復(fù)。一個(gè)健壯的部署至少需要三個(gè)哨兵實(shí)例。
每個(gè)Sentinel以每秒鐘一次的頻率向它所知的Master,Slave以及其他 Sentinel 實(shí)例發(fā)送一個(gè) PING 命令?
2.如果一個(gè)實(shí)例(instance)距離最后一次有效回復(fù) PING 命令的時(shí)間超過(guò) down-after-milliseconds 選項(xiàng)所指定的值, 則這個(gè)實(shí)例會(huì)被 Sentinel 標(biāo)記為主觀下線。
3.如果一個(gè)Master被標(biāo)記為主觀下線,則正在監(jiān)視這個(gè)Master的所有 Sentinel 要以每秒一次的頻率確認(rèn)Master的確進(jìn)入了主觀下線狀態(tài)。
4.當(dāng)有足夠數(shù)量的 Sentinel(大于等于配置文件指定的值)在指定的時(shí)間范圍內(nèi)確認(rèn)Master的確進(jìn)入了主觀下線狀態(tài), 則Master會(huì)被標(biāo)記為客觀下線?
5.在一般情況下, 每個(gè) Sentinel 會(huì)以每 10 秒一次的頻率向它已知的所有Master,Slave發(fā)送 INFO 命令?
6.當(dāng)Master被 Sentinel 標(biāo)記為客觀下線時(shí),Sentinel 向下線的 Master 的所有 Slave 發(fā)送 INFO 命令的頻率會(huì)從 10 秒一次改為每秒一次?
7.若沒(méi)有足夠數(shù)量的 Sentinel 同意 Master 已經(jīng)下線, Master 的客觀下線狀態(tài)就會(huì)被移除。若 Master 重新向 Sentinel 的 PING 命令返回有效回復(fù), Master 的主觀下線狀態(tài)就會(huì)被移除。