常见坑人无数的Redis面试题总结
Redis有哪些數(shù)據(jù)結(jié)構(gòu)?
字符串String、字典Hash、列表List、集合Set、有序集合SortedSet。
如果你是Redis中高級用戶,還需要加上下面幾種數(shù)據(jù)結(jié)構(gòu)HyperLogLog、Geo、Pub/Sub。
如果你說還玩過Redis Module,像BloomFilter,RedisSearch,Redis-ML,面試官得眼睛就開始發(fā)亮了。
使用過Redis分布式鎖么,它是什么回事?
先拿setnx來爭搶鎖,搶到之后,再用expire給鎖加一個過期時(shí)間防止鎖忘記了釋放。
意外crash或者要重啟維護(hù)了,那會怎么樣?
set指令有非常復(fù)雜的參數(shù),這個應(yīng)該是可以同時(shí)把setnx和expire合成一條指令來用的
假如Redis里面有1億個key,其中有10w個key是以某個固定的已知的前綴開頭的,如果將它們?nèi)空页鰜?#xff1f;
使用keys指令可以掃出指定模式的key列表。
如果這個redis正在給線上的業(yè)務(wù)提供服務(wù),那使用keys指令會有什么問題?
這個時(shí)候你要回答redis關(guān)鍵的一個特性:redis的單線程的。keys指令會導(dǎo)致線程阻塞一段時(shí)間,線上服務(wù)會停頓,直到指令執(zhí)行完畢,服務(wù)才能恢復(fù)。這個時(shí)候可以使用scan指令,scan指令可以無阻塞的提取出指定模式的key列表,但是會有一定的重復(fù)概率,在客戶端做一次去重就可以了,但是整體所花費(fèi)的時(shí)間會比直接用keys指令長。
使用過Redis做異步隊(duì)列么,你是怎么用的?
一般使用list結(jié)構(gòu)作為隊(duì)列,rpush生產(chǎn)消息,lpop消費(fèi)消息。當(dāng)lpop沒有消息的時(shí)候,要適當(dāng)sleep一會再重試。
可不可以不用sleep呢?
list還有個指令叫blpop,在沒有消息的時(shí)候,它會阻塞住直到消息到來。
能不能生產(chǎn)一次消費(fèi)多次呢?
使用pub/sub主題訂閱者模式,可以實(shí)現(xiàn)1:N的消息隊(duì)列。
追問pub/sub有什么缺點(diǎn)?
在消費(fèi)者下線的情況下,生產(chǎn)的消息會丟失,得使用專業(yè)的消息隊(duì)列如rabbitmq等。
redis如何實(shí)現(xiàn)延時(shí)隊(duì)列?
使用sortedset,拿時(shí)間戳作為score,消息內(nèi)容作為key調(diào)用zadd來生產(chǎn)消息,消費(fèi)者用zrangebyscore指令獲取N秒之前的數(shù)據(jù)輪詢進(jìn)行處理。
如果有大量的key需要設(shè)置同一時(shí)間過期,一般需要注意什么?
如果大量的key過期時(shí)間設(shè)置的過于集中,到過期的那個時(shí)間點(diǎn),redis可能會出現(xiàn)短暫的卡頓現(xiàn)象。一般需要在時(shí)間上加一個隨機(jī)值,使得過期時(shí)間分散一些。
Redis如何做持久化的?
bgsave做鏡像全量持久化,aof做增量持久化。因?yàn)閎gsave會耗費(fèi)較長時(shí)間,不夠?qū)崟r(shí),在停機(jī)的時(shí)候會導(dǎo)致大量丟失數(shù)據(jù),所以需要aof來配合使用。在redis實(shí)例重啟時(shí),會使用bgsave持久化文件重新構(gòu)建內(nèi)存,再使用aof重放近期的操作指令來實(shí)現(xiàn)完整恢復(fù)重啟之前的狀態(tài)。
如果突然機(jī)器掉電會怎樣?
取決于aof日志sync屬性的配置,如果不要求性能,在每條寫指令時(shí)都sync一下磁盤,就不會丟失數(shù)據(jù)。但是在高性能的要求下每次都sync是不現(xiàn)實(shí)的,一般都使用定時(shí)sync,比如1s1次,這個時(shí)候最多就會丟失1s的數(shù)據(jù)。
bgsave的原理是什么?
你給出兩個詞匯就可以了,fork和cow。fork是指redis通過創(chuàng)建子進(jìn)程來進(jìn)行bgsave操作,cow指的是copy on write,子進(jìn)程創(chuàng)建后,父子進(jìn)程共享數(shù)據(jù)段,父進(jìn)程繼續(xù)提供讀寫服務(wù),寫臟的頁面數(shù)據(jù)會逐漸和子進(jìn)程分離開來。
Pipeline有什么好處,為什么要用pipeline?
可以將多次IO往返的時(shí)間縮減為一次,前提是pipeline執(zhí)行的指令之間沒有因果相關(guān)性。使用redis-benchmark進(jìn)行壓測的時(shí)候可以發(fā)現(xiàn)影響redis的QPS峰值的一個重要因素是pipeline批次指令的數(shù)目。
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)行重放就完成了同步過程。
是否使用過Redis集群,集群的原理是什么?
Redis Sentinal著眼于高可用,在master宕機(jī)時(shí)會自動將slave提升為master,繼續(xù)提供服務(wù)。
Redis Cluster著眼于擴(kuò)展性,在單個redis內(nèi)存不足時(shí),使用Cluster進(jìn)行分片存儲。
總結(jié)
以上是生活随笔為你收集整理的常见坑人无数的Redis面试题总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用yum查看安装了哪些软件包、某软件包
- 下一篇: 常见Linux面试题总结