面試中程序員常見的Redis"刁難"問題,值得一讀!

導讀

在程序員面試過程當中Redis相關的知識是常被問到的話題。做爲一名在互聯網技術行業打擊過成百上千名的資深技術面試官,總結了面試過程當中常常問到的問題。十分值得一讀。java

Redis有哪些數據結構?

字符串String、字典Hash、列表List、集合Set、有序集合SortedSet。
若是你是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

使用過Redis作異步隊列麼,你是怎麼用的?

通常使用list結構做爲隊列,rpush生產消息,lpop消費消息。當lpop沒有消息的時候,要適當sleep一會再重試。安全

  • 若是對方追問可不能夠不用sleep呢?list還有個指令叫blpop,在沒有消息的時候,它會阻塞住直到消息到來。
  • 若是對方追問能不能生產一次消費屢次呢?使用pub/sub主題訂閱者模式,能夠實現1:N的消息隊列。
  • 若是對方追問pub/sub有什麼缺點?在消費者下線的狀況下,生產的消息會丟失,得使用專業的消息隊列如rabbitmq等。
  • 若是對方追問redis如何實現延時隊列?我估計如今你很想把面試官一棒打死若是你手上有一根棒球棍的話,怎麼問的這麼詳細。
可是你很剋制,而後神態自若的回答道:使用sortedset,拿時間戳做爲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集羣,集羣的原理是什麼?

Redis Sentinal着眼於高可用,在master宕機時會自動將slave提高爲master,繼續提供服務。
Redis Cluster着眼於擴展性,在單個redis內存不足時,使用Cluster進行分片存儲。

面試資料分享

資料領取方式:

點擊連接加入【互聯網java高級架構536172545】:https://jq.qq.com/?_wv=1027&k=5S5wh8D

以上是個人私人羣,有更多更新面試資料免費領取!還有大牛進行技術交流與指導哦!

相關文章
相關標籤/搜索