1. 程式人生 > >Redis必知面試題

Redis必知面試題

一.、Redis常用資料結構有哪些?

  1. 字串String
  2. Hash、
  3. 列表List、
  4. 集合Set、
  5. 有序集合zSet。 

加分點

  • 如果你是Redis中高階使用者,還需要加上下面幾種資料結構HyperLogLog、Geo、Pub/Sub。 
  • 如果你說還玩過Redis Module,像BloomFilter,RedisSearch,Redis-ML

 

二、 對Redis分散式鎖瞭解嗎,它是什麼回事?

先拿setnx來爭搶鎖,搶到之後,再用expire給鎖加一個過期時間防止鎖忘記了釋放。 

問:這時候對方會告訴你說你回答得不錯,然後接著問如果在setnx之後執行expire之前程序意外crash或者要重啟維護了,那會怎麼樣? 

這個鎖就永遠得不到釋放了。我記得set指令有非常複雜的引數,這個應該是可以同時把setnx和expire合成一條指令來用的

 

三、Redis裡面有1億個key,其中有10w個key是以某個固定的已知的字首開頭的,如何將它們全部找出來?

使用keys指令可以掃出指定模式的key列表。 

追問:如果這個redis正在給線上的業務提供服務,那使用keys指令會有什麼問題? 

這個時候你要回答redis關鍵的一個特性:redis的單執行緒的

。keys指令會導致執行緒阻塞一段時間,線上服務會停頓,直到指令執行完畢,服務才能恢復。

這個時候可以使用scan指令,scan指令可以無阻塞的提取出指定模式的key列表,但是會有一定的重複概率,在客戶端做一次去重就可以了,但是整體所花費的時間會比直接用keys指令長。

 

四、使用過Redis做非同步佇列麼,你是怎麼用的?

一般使用list結構作為佇列,rpush生產訊息,lpop消費訊息。當lpop沒有訊息的時候,要適當sleep一會再重試。 

追問:可不可以不用sleep呢?

list還有個指令叫blpop,在沒有訊息的時候,它會阻塞住直到訊息到來。 

追問:能不能生產一次消費多次呢?

使用pub/sub主題訂閱者模式,可以實現1:N的訊息佇列。 

追問:pub/sub有什麼缺點?

在消費者下線的情況下,生產的訊息會丟失,得使用專業的訊息佇列如rabbitmq等。 

追問:redis如何實現延時佇列?

使用zset,拿時間戳作為score,訊息內容作為key呼叫zadd來生產訊息,消費者用zrangebyscore指令獲取N秒之前的資料輪詢進行處理。 

 

五、如果有大量的key需要設定同一時間過期,一般需要注意什麼?

如果大量的key過期時間設定的過於集中,到過期的那個時間點,redis可能會出現短暫的卡頓現象。一般需要在時間上加一個隨機值,使得過期時間分散一些。

 

六、Redis如何做持久化的?

bgsave做映象全量持久化,aof做增量持久化

因為bgsave會耗費較長時間,不夠實時,在停機的時候會導致大量丟失資料,所以需要aof來配合使用。在redis例項重啟時,優先使用aof來恢復記憶體的狀態,如果沒有aof日誌,就會使用rdb檔案來恢復。 

問:aof檔案過大恢復時間過長怎麼辦?

你告訴面試官,Redis會定期做aof重寫,壓縮aof檔案日誌大小。

如果面試官不夠滿意,再拿出殺手鐗答案,Redis4.0之後有了混合持久化的功能,將bgsave的全量和aof的增量做了融合處理,這樣既保證了恢復的效率又兼顧了資料的安全性。這個功能甚至很多面試官都不知道,他們肯定會對你刮目相看。 

追問:那如果突然機器掉電會怎樣?

取決於aof日誌sync屬性的配置,如果不要求效能,在每條寫指令時都sync一下磁碟,就不會丟失資料。但是在高效能的要求下每次都sync是不現實的,一般都使用定時sync,比如1s1次,這個時候最多就會丟失1s的資料。

 

七、Pipeline有什麼好處,為什麼要用pipeline?

可以將多次IO往返的時間縮減為一次,前提是pipeline執行的指令之間沒有因果相關性。使用redis-benchmark進行壓測的時候可以發現影響redis的QPS峰值的一個重要因素是pipeline批次指令的數目。

 

八、Redis的同步機制瞭解麼?

從從同步。第一次同步時,主節點做一次bgsave,並同時將後續修改操作記錄到記憶體buffer,待完成後將rdb檔案全量同步到複製節點,複製節點接受完成後將rdb映象載入到記憶體。載入完成後,再通知主節點將期間修改的操作記錄同步到複製節點進行重放就完成了同步過程。

 

九、是否使用過Redis叢集,叢集的原理是什麼?

  • Redis Sentinal著眼於高可用,在master宕機時會自動將slave提升為master,繼續提供服務。 
  • Redis Cluster著眼於擴充套件性,在單個redis記憶體不足時,使用Cluster進行分片儲存。