9個常見的Redis面試"刁難"問題
創(chuàng)新互聯(lián)建站是一家業(yè)務(wù)范圍包括IDC托管業(yè)務(wù),雅安服務(wù)器托管、主機(jī)租用、主機(jī)托管,四川、重慶、廣東電信服務(wù)器租用,綿陽主機(jī)托管,成都網(wǎng)通服務(wù)器托管,成都服務(wù)器租用,業(yè)務(wù)范圍遍及中國大陸、港澳臺以及歐美等多個國家及地區(qū)的互聯(lián)網(wǎng)數(shù)據(jù)服務(wù)公司。字符串String、字典Hash、列表List、集合Set、有序集合SortedSet。
如果你是Redis中高級用戶,還需要加上下面幾種數(shù)據(jù)結(jié)構(gòu)HyperLogLog、Geo、Pub/Sub。
如果你說還玩過Redis Module,像BloomFilter,RedisSearch,Redis-ML,面試官得眼睛就開始發(fā)亮了。
先拿setnx來爭搶鎖,搶到之后,再用expire給鎖加一個過期時間防止鎖忘記了釋放。
這時候?qū)Ψ綍嬖V你說你回答得不錯,然后接著問如果在setnx之后執(zhí)行expire之前進(jìn)程意外crash或者要重啟維護(hù)了,那會怎么樣?
這時候你要給予驚訝的反饋:唉,是喔,這個鎖就永遠(yuǎn)得不到釋放了。緊接著你需要抓一抓自己得腦袋,故作思考片刻,好像接下來的結(jié)果是你主動思考出來的,然后回答:我記得set指令有非常復(fù)雜的參數(shù),這個應(yīng)該是可以同時把setnx和expire合成一條指令來用的!對方這時會顯露笑容,心里開始默念:摁,這小子還不錯。
使用keys指令可以掃出指定模式的key列表。
對方接著追問:如果這個redis正在給線上的業(yè)務(wù)提供服務(wù),那使用keys指令會有什么問題?
這個時候你要回答redis關(guān)鍵的一個特性:redis的單線程的。keys指令會導(dǎo)致線程阻塞一段時間,線上服務(wù)會停頓,直到指令執(zhí)行完畢,服務(wù)才能恢復(fù)。這個時候可以使用scan指令,scan指令可以無阻塞的提取出指定模式的key列表,但是會有一定的重復(fù)概率,在客戶端做一次去重就可以了,但是整體所花費的時間會比直接用keys指令長。
一般使用list結(jié)構(gòu)作為隊列,rpush生產(chǎn)消息,lpop消費消息。當(dāng)lpop沒有消息的時候,要適當(dāng)sleep一會再重試。
如果對方追問可不可以不用sleep呢?list還有個指令叫blpop,在沒有消息的時候,它會阻塞住直到消息到來。
如果對方追問能不能生產(chǎn)一次消費多次呢?使用pub/sub主題訂閱者模式,可以實現(xiàn)1:N的消息隊列。
如果對方追問pub/sub有什么缺點?在消費者下線的情況下,生產(chǎn)的消息會丟失,得使用專業(yè)的消息隊列如rabbitmq等。
如果對方追問redis如何實現(xiàn)延時隊列?我估計現(xiàn)在你很想把面試官一棒打死如果你手上有一根棒球棍的話,怎么問的這么詳細(xì)。但是你很克制,然后神態(tài)自若的回答道:使用sortedset,拿時間戳作為score,消息內(nèi)容作為key調(diào)用zadd來生產(chǎn)消息,消費者用zrangebyscore指令獲取N秒之前的數(shù)據(jù)輪詢進(jìn)行處理。
到這里,面試官暗地里已經(jīng)對你豎起了大拇指。但是他不知道的是此刻你卻豎起了中指,在椅子背后。
如果大量的key過期時間設(shè)置的過于集中,到過期的那個時間點,redis可能會出現(xiàn)短暫的卡頓現(xiàn)象。一般需要在時間上加一個隨機(jī)值,使得過期時間分散一些。
bgsave做鏡像全量持久化,aof做增量持久化。因為bgsave會耗費較長時間,不夠?qū)崟r,在停機(jī)的時候會導(dǎo)致大量丟失數(shù)據(jù),所以需要aof來配合使用。在redis實例重啟時,優(yōu)先使用aof來恢復(fù)內(nèi)存的狀態(tài),如果沒有aof日志,就會使用rdb文件來恢復(fù)。
如果再問aof文件過大恢復(fù)時間過長怎么辦?你告訴面試官,Redis會定期做aof重寫,壓縮aof文件日志大小。如果面試官不夠滿意,再拿出殺手锏答案,Redis4.0之后有了混合持久化的功能,將bgsave的全量和aof的增量做了融合處理,這樣既保證了恢復(fù)的效率又兼顧了數(shù)據(jù)的安全性。這個功能甚至很多面試官都不知道,他們肯定會對你刮目相看。
如果對方追問那如果突然機(jī)器掉電會怎樣?取決于aof日志sync屬性的配置,如果不要求性能,在每條寫指令時都sync一下磁盤,就不會丟失數(shù)據(jù)。但是在高性能的要求下每次都sync是不現(xiàn)實的,一般都使用定時sync,比如1s1次,這個時候最多就會丟失1s的數(shù)據(jù)。
可以將多次IO往返的時間縮減為一次,前提是pipeline執(zhí)行的指令之間沒有因果相關(guān)性。使用redis-benchmark進(jìn)行壓測的時候可以發(fā)現(xiàn)影響redis的QPS峰值的一個重要因素是pipeline批次指令的數(shù)目。
Redis可以使用主從同步,從從同步。第一次同步時,主節(jié)點做一次bgsave,并同時將后續(xù)修改操作記錄到內(nèi)存buffer,待完成后將rdb文件全量同步到復(fù)制節(jié)點,復(fù)制節(jié)點接受完成后將rdb鏡像加載到內(nèi)存。加載完成后,再通知主節(jié)點將期間修改的操作記錄同步到復(fù)制節(jié)點進(jìn)行重放就完成了同步過程。
Redis Sentinal著眼于高可用,在master宕機(jī)時會自動將slave提升為master,繼續(xù)提供服務(wù)。
Redis Cluster著眼于擴(kuò)展性,在單個redis內(nèi)存不足時,使用Cluster進(jìn)行分片存儲。
Redis Cluster 是Redis的集群實現(xiàn),內(nèi)置數(shù)據(jù)自動分片機(jī)制,集群內(nèi)部將所有的key映射到16384個Slot中,集群中的每個Redis Instance負(fù)責(zé)其中的一部分的Slot的讀寫。集群客戶端連接集群中任一Redis Instance即可發(fā)送命令,當(dāng)Redis Instance收到自己不負(fù)責(zé)的Slot的請求時,會將負(fù)責(zé)請求Key所在Slot的Redis Instance地址返回給客戶端,客戶端收到后自動將原請求重新發(fā)往這個地址,對外部透明。一個Key到底屬于哪個Slot由crc16(key) % 16384 決定。
關(guān)于負(fù)載均衡,集群的Redis Instance之間可以遷移數(shù)據(jù),以Slot為單位,但不是自動的,需要外部命令觸發(fā)。
關(guān)于集群成員管理,集群的節(jié)點(Redis Instance)和節(jié)點之間兩兩定期交換集群內(nèi)節(jié)點信息并且更新,從發(fā)送節(jié)點的角度看,這些信息包括:集群內(nèi)有哪些節(jié)點,IP和PORT是什么,節(jié)點名字是什么,節(jié)點的狀態(tài)(比如OK,PFAIL,F(xiàn)AIL,后面詳述)是什么,包括節(jié)點角色(master 或者 slave)等。
關(guān)于可用性,集群由N組主從Redis Instance組成。主可以沒有從,但是沒有從 意味著主宕機(jī)后主負(fù)責(zé)的Slot讀寫服務(wù)不可用。一個主可以有多個從,主宕機(jī)時,某個從會被提升為主,具體哪個從被提升為主,協(xié)議類似于Raft,參見這里。如何檢測主宕機(jī)?Redis Cluster采用quorum+心跳的機(jī)制。從節(jié)點的角度看,節(jié)點會定期給其他所有的節(jié)點發(fā)送Ping,cluster-node-timeout(可配置,秒級)時間內(nèi)沒有收到對方的回復(fù),則單方面認(rèn)為對端節(jié)點宕機(jī),將該節(jié)點標(biāo)為PFAIL狀態(tài)。通過節(jié)點之間交換信息收集到quorum個節(jié)點都認(rèn)為這個節(jié)點為PFAIL,則將該節(jié)點標(biāo)記為FAIL,并且將其發(fā)送給其他所有節(jié)點,其他所有節(jié)點收到后立即認(rèn)為該節(jié)點宕機(jī)。從這里可以看出,主宕機(jī)后,至少cluster-node-timeout時間內(nèi)該主所負(fù)責(zé)的Slot的讀寫服務(wù)不可用。
文章來源:高可用架構(gòu)
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。