9個(gè)常見(jiàn)的Redis面試-創(chuàng)新互聯(lián)

9個(gè)常見(jiàn)的Redis面試"刁難"問(wèn)題

創(chuàng)新互聯(lián)建站是一家業(yè)務(wù)范圍包括IDC托管業(yè)務(wù),雅安服務(wù)器托管、主機(jī)租用、主機(jī)托管,四川、重慶、廣東電信服務(wù)器租用,綿陽(yáng)主機(jī)托管,成都網(wǎng)通服務(wù)器托管,成都服務(wù)器租用,業(yè)務(wù)范圍遍及中國(guó)大陸、港澳臺(tái)以及歐美等多個(gè)國(guó)家及地區(qū)的互聯(lián)網(wǎng)數(shù)據(jù)服務(wù)公司。

1 Redis有哪些數(shù)據(jù)結(jié)構(gòu)?

字符串String、字典Hash、列表List、集合Set、有序集合SortedSet。
如果你是Redis中高級(jí)用戶,還需要加上下面幾種數(shù)據(jù)結(jié)構(gòu)HyperLogLog、Geo、Pub/Sub。
如果你說(shuō)還玩過(guò)Redis Module,像BloomFilter,RedisSearch,Redis-ML,面試官得眼睛就開(kāi)始發(fā)亮了。

2 使用過(guò)Redis分布式鎖么,它是什么回事?

先拿setnx來(lái)爭(zhēng)搶鎖,搶到之后,再用expire給鎖加一個(gè)過(guò)期時(shí)間防止鎖忘記了釋放。
這時(shí)候?qū)Ψ綍?huì)告訴你說(shuō)你回答得不錯(cuò),然后接著問(wèn)如果在setnx之后執(zhí)行expire之前進(jìn)程意外crash或者要重啟維護(hù)了,那會(huì)怎么樣?
這時(shí)候你要給予驚訝的反饋:唉,是喔,這個(gè)鎖就永遠(yuǎn)得不到釋放了。緊接著你需要抓一抓自己得腦袋,故作思考片刻,好像接下來(lái)的結(jié)果是你主動(dòng)思考出來(lái)的,然后回答:我記得set指令有非常復(fù)雜的參數(shù),這個(gè)應(yīng)該是可以同時(shí)把setnx和expire合成一條指令來(lái)用的!對(duì)方這時(shí)會(huì)顯露笑容,心里開(kāi)始默念:摁,這小子還不錯(cuò)。

3 假如Redis里面有1億個(gè)key,其中有10w個(gè)key是以某個(gè)固定的已知的前綴開(kāi)頭的,如果將它們?nèi)空页鰜?lái)?

使用keys指令可以掃出指定模式的key列表。
對(duì)方接著追問(wèn):如果這個(gè)redis正在給線上的業(yè)務(wù)提供服務(wù),那使用keys指令會(huì)有什么問(wèn)題?
這個(gè)時(shí)候你要回答redis關(guān)鍵的一個(gè)特性:redis的單線程的。keys指令會(huì)導(dǎo)致線程阻塞一段時(shí)間,線上服務(wù)會(huì)停頓,直到指令執(zhí)行完畢,服務(wù)才能恢復(fù)。這個(gè)時(shí)候可以使用scan指令,scan指令可以無(wú)阻塞的提取出指定模式的key列表,但是會(huì)有一定的重復(fù)概率,在客戶端做一次去重就可以了,但是整體所花費(fèi)的時(shí)間會(huì)比直接用keys指令長(zhǎng)。

4 使用過(guò)Redis做異步隊(duì)列么,你是怎么用的?

一般使用list結(jié)構(gòu)作為隊(duì)列,rpush生產(chǎn)消息,lpop消費(fèi)消息。當(dāng)lpop沒(méi)有消息的時(shí)候,要適當(dāng)sleep一會(huì)再重試。
如果對(duì)方追問(wèn)可不可以不用sleep呢?list還有個(gè)指令叫blpop,在沒(méi)有消息的時(shí)候,它會(huì)阻塞住直到消息到來(lái)。
如果對(duì)方追問(wèn)能不能生產(chǎn)一次消費(fèi)多次呢?使用pub/sub主題訂閱者模式,可以實(shí)現(xiàn)1:N的消息隊(duì)列。
如果對(duì)方追問(wèn)pub/sub有什么缺點(diǎn)?在消費(fèi)者下線的情況下,生產(chǎn)的消息會(huì)丟失,得使用專業(yè)的消息隊(duì)列如rabbitmq等。
如果對(duì)方追問(wèn)redis如何實(shí)現(xiàn)延時(shí)隊(duì)列?我估計(jì)現(xiàn)在你很想把面試官一棒打死如果你手上有一根棒球棍的話,怎么問(wèn)的這么詳細(xì)。但是你很克制,然后神態(tài)自若的回答道:使用sortedset,拿時(shí)間戳作為score,消息內(nèi)容作為key調(diào)用zadd來(lái)生產(chǎn)消息,消費(fèi)者用zrangebyscore指令獲取N秒之前的數(shù)據(jù)輪詢進(jìn)行處理。
到這里,面試官暗地里已經(jīng)對(duì)你豎起了大拇指。但是他不知道的是此刻你卻豎起了中指,在椅子背后。

5 如果有大量的key需要設(shè)置同一時(shí)間過(guò)期,一般需要注意什么?

如果大量的key過(guò)期時(shí)間設(shè)置的過(guò)于集中,到過(guò)期的那個(gè)時(shí)間點(diǎn),redis可能會(huì)出現(xiàn)短暫的卡頓現(xiàn)象。一般需要在時(shí)間上加一個(gè)隨機(jī)值,使得過(guò)期時(shí)間分散一些。

6 Redis如何做持久化的?

bgsave做鏡像全量持久化,aof做增量持久化。因?yàn)閎gsave會(huì)耗費(fèi)較長(zhǎng)時(shí)間,不夠?qū)崟r(shí),在停機(jī)的時(shí)候會(huì)導(dǎo)致大量丟失數(shù)據(jù),所以需要aof來(lái)配合使用。在redis實(shí)例重啟時(shí),優(yōu)先使用aof來(lái)恢復(fù)內(nèi)存的狀態(tài),如果沒(méi)有aof日志,就會(huì)使用rdb文件來(lái)恢復(fù)。
如果再問(wèn)aof文件過(guò)大恢復(fù)時(shí)間過(guò)長(zhǎng)怎么辦?你告訴面試官,Redis會(huì)定期做aof重寫(xiě),壓縮aof文件日志大小。如果面試官不夠滿意,再拿出殺手锏答案,Redis4.0之后有了混合持久化的功能,將bgsave的全量和aof的增量做了融合處理,這樣既保證了恢復(fù)的效率又兼顧了數(shù)據(jù)的安全性。這個(gè)功能甚至很多面試官都不知道,他們肯定會(huì)對(duì)你刮目相看。
如果對(duì)方追問(wèn)那如果突然機(jī)器掉電會(huì)怎樣?取決于aof日志sync屬性的配置,如果不要求性能,在每條寫(xiě)指令時(shí)都sync一下磁盤,就不會(huì)丟失數(shù)據(jù)。但是在高性能的要求下每次都sync是不現(xiàn)實(shí)的,一般都使用定時(shí)sync,比如1s1次,這個(gè)時(shí)候最多就會(huì)丟失1s的數(shù)據(jù)。

7 Pipeline有什么好處,為什么要用pipeline?

可以將多次IO往返的時(shí)間縮減為一次,前提是pipeline執(zhí)行的指令之間沒(méi)有因果相關(guān)性。使用redis-benchmark進(jìn)行壓測(cè)的時(shí)候可以發(fā)現(xiàn)影響redis的QPS峰值的一個(gè)重要因素是pipeline批次指令的數(shù)目。

8 Redis的同步機(jī)制了解么?

Redis可以使用主從同步,從從同步。第一次同步時(shí),主節(jié)點(diǎn)做一次bgsave,并同時(shí)將后續(xù)修改操作記錄到內(nèi)存buffer,待完成后將rdb文件全量同步到復(fù)制節(jié)點(diǎn),復(fù)制節(jié)點(diǎn)接受完成后將rdb鏡像加載到內(nèi)存。加載完成后,再通知主節(jié)點(diǎn)將期間修改的操作記錄同步到復(fù)制節(jié)點(diǎn)進(jìn)行重放就完成了同步過(guò)程。

9 是否使用過(guò)Redis集群,集群的原理是什么?

Redis Sentinal著眼于高可用,在master宕機(jī)時(shí)會(huì)自動(dòng)將slave提升為master,繼續(xù)提供服務(wù)。
Redis Cluster著眼于擴(kuò)展性,在單個(gè)redis內(nèi)存不足時(shí),使用Cluster進(jìn)行分片存儲(chǔ)。

Redis Cluster原理

Redis Cluster 是Redis的集群實(shí)現(xiàn),內(nèi)置數(shù)據(jù)自動(dòng)分片機(jī)制,集群內(nèi)部將所有的key映射到16384個(gè)Slot中,集群中的每個(gè)Redis Instance負(fù)責(zé)其中的一部分的Slot的讀寫(xiě)。集群客戶端連接集群中任一Redis Instance即可發(fā)送命令,當(dāng)Redis Instance收到自己不負(fù)責(zé)的Slot的請(qǐng)求時(shí),會(huì)將負(fù)責(zé)請(qǐng)求Key所在Slot的Redis Instance地址返回給客戶端,客戶端收到后自動(dòng)將原請(qǐng)求重新發(fā)往這個(gè)地址,對(duì)外部透明。一個(gè)Key到底屬于哪個(gè)Slot由crc16(key) % 16384 決定。

關(guān)于負(fù)載均衡,集群的Redis Instance之間可以遷移數(shù)據(jù),以Slot為單位,但不是自動(dòng)的,需要外部命令觸發(fā)。

關(guān)于集群成員管理,集群的節(jié)點(diǎn)(Redis Instance)和節(jié)點(diǎn)之間兩兩定期交換集群內(nèi)節(jié)點(diǎn)信息并且更新,從發(fā)送節(jié)點(diǎn)的角度看,這些信息包括:集群內(nèi)有哪些節(jié)點(diǎn),IP和PORT是什么,節(jié)點(diǎn)名字是什么,節(jié)點(diǎn)的狀態(tài)(比如OK,PFAIL,F(xiàn)AIL,后面詳述)是什么,包括節(jié)點(diǎn)角色(master 或者 slave)等。

關(guān)于可用性,集群由N組主從Redis Instance組成。主可以沒(méi)有從,但是沒(méi)有從 意味著主宕機(jī)后主負(fù)責(zé)的Slot讀寫(xiě)服務(wù)不可用。一個(gè)主可以有多個(gè)從,主宕機(jī)時(shí),某個(gè)從會(huì)被提升為主,具體哪個(gè)從被提升為主,協(xié)議類似于Raft,參見(jiàn)這里。如何檢測(cè)主宕機(jī)?Redis Cluster采用quorum+心跳的機(jī)制。從節(jié)點(diǎn)的角度看,節(jié)點(diǎn)會(huì)定期給其他所有的節(jié)點(diǎn)發(fā)送Ping,cluster-node-timeout(可配置,秒級(jí))時(shí)間內(nèi)沒(méi)有收到對(duì)方的回復(fù),則單方面認(rèn)為對(duì)端節(jié)點(diǎn)宕機(jī),將該節(jié)點(diǎn)標(biāo)為PFAIL狀態(tài)。通過(guò)節(jié)點(diǎn)之間交換信息收集到quorum個(gè)節(jié)點(diǎn)都認(rèn)為這個(gè)節(jié)點(diǎn)為PFAIL,則將該節(jié)點(diǎn)標(biāo)記為FAIL,并且將其發(fā)送給其他所有節(jié)點(diǎn),其他所有節(jié)點(diǎn)收到后立即認(rèn)為該節(jié)點(diǎn)宕機(jī)。從這里可以看出,主宕機(jī)后,至少cluster-node-timeout時(shí)間內(nèi)該主所負(fù)責(zé)的Slot的讀寫(xiě)服務(wù)不可用。

文章來(lái)源:高可用架構(gòu)

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

新聞名稱:9個(gè)常見(jiàn)的Redis面試-創(chuàng)新互聯(lián)
本文鏈接:http://muchs.cn/article6/dpieig.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供域名注冊(cè)、服務(wù)器托管網(wǎng)頁(yè)設(shè)計(jì)公司、小程序開(kāi)發(fā)、電子商務(wù)、Google

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運(yùn)營(yíng)