Redis面試題

Redis有哪些數據結構?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合成一條指令來用的! spa

    

假如Redis裏面有1億個key,其中有10w個key是以某個固定的已知的前綴開頭的,若是將它們所有找出來?線程

    使用keys指令能夠掃出指定模式的key列表。日誌

    

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

        redis關鍵的一個特性:redis的單線程的。keys指令會致使線程阻塞一段時間,線上服務會停頓,直到指令執行完畢,服務才能恢復。隊列

        這個時候可使用scan指令,scan指令能夠無阻塞的提取出指定模式的key列表,可是會有必定的重複機率,

        在客戶端作一次去重就能夠了,可是總體所花費的時間會比直接用keys指令長。

        

使用過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實例重啓時,會使用bgsave持久化文件從新構建內存,再使用aof重放近期的操做指令來實現完整恢復重啓以前的狀態。

    

若是忽然機器掉電會怎樣?

    取決於aof日誌sync屬性的配置,若是不要求性能,在每條寫指令時都sync一下磁盤,就不會丟失數據。

    可是在高性能的要求下每次都sync是不現實的,通常都使用定時sync,好比1s1次,這個時候最多就會丟失1s的數據。

    

bgsave的原理是什麼?

    fork和cow。fork是指redis經過建立子進程來進行bgsave操做,cow指的是copy on write,

    子進程建立後,父子進程共享數據段,父進程繼續提供讀寫服務,寫髒的頁面數據會逐漸和子進程分離開來。

    

Pipeline有什麼好處,爲何要用pipeline?

    能夠將屢次IO往返的時間縮減爲一次,前提是pipeline執行的指令之間沒有因果相關性。

    使用redis-benchmark進行壓測的時候能夠發現影響redis的QPS峯值的一個重要因素是pipeline批次指令的數目。

    

Redis的同步機制瞭解麼?

    Redis可使用主從同步,從從同步。

    第一次同步時,主節點作一次bgsave,並同時將後續修改操做記錄到內存buffer,待完成後將rdb文件全量同步到複製節點,

    複製節點接受完成後將rdb鏡像加載到內存。

    加載完成後,再通知主節點將期間修改的操做記錄同步到複製節點進行重放就完成了同步過程。

    

是否使用過Redis集羣,集羣的原理是什麼?

    Redis Sentinal着眼於高可用,在master宕機時會自動將slave提高爲master,繼續提供服務。

    Redis Cluster着眼於擴展性,在單個redis內存不足時,使用Cluster進行分片存儲

相關文章
相關標籤/搜索