1. 程式人生 > >Redis必備知識

Redis必備知識


title: Redis必備知識
tags: Redis


本文參考公眾號 高可用架構10個常見的Redis面試刁難問題

Redis有哪些資料結構?

Redis資料結構有:
字串String、字典Hash、列表List、集合Set、有序集合SortedSet。

僅知道上面的還不行,你還需知道HyperLogLog、Geo、Pub/Sub

Redis分散式鎖是什麼回事?

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

如果在setnx之後執行expire之前程序意外crash或者要重啟維護了,那會怎麼樣?這個鎖就永遠得不到釋放了。

如何解決?set指令有非常複雜的引數,可以同時把setnx和expire合成一條指令來用。

Redis非同步佇列是怎麼用的?

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

如果不用sleep呢?list還有個指令叫blpop,在沒有訊息的時候,它會阻塞住直到訊息到來。

如何生產一次消費多次呢?使用pub/sub主題訂閱者模式,可以實現1:N的訊息佇列。

pub/sub有什麼缺點?在消費者下線的情況下,生產的訊息會丟失,得使用專業的訊息佇列如rabbitmq等。

redis如何實現延時佇列?使用sortedset,拿時間戳作為score,訊息內容作為key呼叫zadd來生產訊息,消費者用zrangebyscore指令獲取N秒之前的資料輪詢進行處理。

Redis如何做持久化的?

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

aof檔案過大恢復時間過長怎麼辦?Redis會定期做aof重寫,壓縮aof檔案日誌大小。Redis4.0之後有了混合持久化的功能,將bgsave的全量和aof的增量做了融合處理,這樣既保證了恢復的效率又兼顧了資料的安全性。

在大規模資料中,如何找出有固定字首的key?

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

如果這個redis正在給線上的業務提供服務,那使用keys指令會有什麼問題?redis有一個關鍵的特性:redis的單執行緒的。keys指令會導致執行緒阻塞一段時間,線上服務會停頓,直到指令執行完畢,服務才能恢復。這個時候可以使用scan指令,scan指令可以無阻塞的提取出指定模式的key列表,但是會有一定的重複概率,在客戶端做一次去重就可以了,但是整體所花費的時間會比直接用keys指令長。

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

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

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進行分片儲存。