在程序員面試過程當中Redis相關的知識是常被問到的話題。做爲一名在互聯網技術行業打擊過成百上千名的資深技術面試官,總結了面試過程當中常常問到的問題。十分值得一讀。java
字符串String、字典Hash、列表List、集合Set、有序集合SortedSet。
若是你是Redis中高級用戶,還須要加上下面幾種數據結構HyperLogLog、Geo、Pub/Sub。
若是你說還玩過Redis Module,像BloomFilter,RedisSearch,Redis-ML,面試官得眼睛就開始發亮了。程序員
先拿setnx來爭搶鎖,搶到以後,再用expire給鎖加一個過時時間防止鎖忘記了釋放。
這時候對方會告訴你說你回答得不錯,而後接着問若是在setnx以後執行expire以前進程意外crash或者要重啓維護了,那會怎麼樣?面試
這時候你要給予驚訝的反饋:唉,是喔,這個鎖就永遠得不到釋放了。緊接着你須要抓一抓本身得腦殼,故做思考片刻,好像接下來的結果是你主動思考出來的,而後回答:我記得set指令有很是複雜的參數,這個應該是能夠同時把setnx和expire合成一條指令來用的!對方這時會顯露笑容,內心開始默唸:摁,這小子還不錯。
使用keys指令能夠掃出指定模式的key列表。
對方接着追問:若是這個redis正在給線上的業務提供服務,那使用keys指令會有什麼問題?
這個時候你要回答redis關鍵的一個特性:redis的單線程的。keys指令會致使線程阻塞一段時間,線上服務會停頓,直到指令執行完畢,服務才能恢復。這個時候可使用scan指令,scan指令能夠無阻塞的提取出指定模式的key列表,可是會有必定的重複機率,在客戶端作一次去重就能夠了,可是總體所花費的時間會比直接用keys指令長。redis
通常使用list結構做爲隊列,rpush生產消息,lpop消費消息。當lpop沒有消息的時候,要適當sleep一會再重試。安全
可是你很剋制,而後神態自若的回答道:使用sortedset,拿時間戳做爲score,消息內容做爲key調用zadd來生產消息,消費者用zrangebyscore指令獲取N秒以前的數據輪詢進行處理。
到這裏,面試官暗地裏已經對你豎起了大拇指。可是他不知道的是此刻你卻豎起了中指,在椅子背後。數據結構
若是大量的key過時時間設置的過於集中,到過時的那個時間點,redis可能會出現短暫的卡頓現象。通常須要在時間上加一個隨機值,使得過時時間分散一些。架構
文末有分享面試專題資料!
bgsave作鏡像全量持久化,aof作增量持久化。由於bgsave會耗費較長時間,不夠實時,在停機的時候會致使大量丟失數據,因此須要aof來配合使用。在redis實例重啓時,優先使用aof來恢復內存的狀態,若是沒有aof日誌,就會使用rdb文件來恢復。異步
你告訴面試官,Redis會按期作aof重寫,壓縮aof文件日誌大小。若是面試官不夠滿意,再拿出殺手鐗答案,Redis4.0以後有了混合持久化的功能,將bgsave的全量和aof的增量作了融合處理,這樣既保證了恢復的效率又兼顧了數據的安全性。這個功能甚至不少面試官都不知道,他們確定會對你另眼相看。
若是對方追問那若是忽然機器掉電會怎樣?取決於aof日誌sync屬性的配置,若是不要求性能,在每條寫指令時都sync一下磁盤,就不會丟失數據。可是在高性能的要求下每次都sync是不現實的,通常都使用定時sync,好比1s1次,這個時候最多就會丟失1s的數據。分佈式
能夠將屢次IO往返的時間縮減爲一次,前提是pipeline執行的指令之間沒有因果相關性。使用redis-benchmark進行壓測的時候能夠發現影響redis的QPS峯值的一個重要因素是pipeline批次指令的數目。性能
Redis Sentinal着眼於高可用,在master宕機時會自動將slave提高爲master,繼續提供服務。
Redis Cluster着眼於擴展性,在單個redis內存不足時,使用Cluster進行分片存儲。
資料領取方式:
點擊連接加入【互聯網java高級架構536172545】:https://jq.qq.com/?_wv=1027&k=5S5wh8D
以上是個人私人羣,有更多更新面試資料免費領取!還有大牛進行技術交流與指導哦!