點讚再看,越點越帥
首先面試redis的基礎知識:
我:redis有5種數據結構:String,Hash,List,Set,SortedSet
其他數據結構有:HyperLog,Geo,Pub/Sub(訂閱與發布)
還有用於防止緩存擊透的數據結構:Redis Module
然後還有一個設置key值的過期時間 :setRedis(Key,value,time+Math.random()*10000); expire
我:(媽耶這麼快就直接到鎖了嘛?我假裝淡定)這個可以使用setnx這個命令來實現,首先用setnx來爭搶鎖,搶到之後,在用expire給鎖加一個過期時間,用來防止自己在之後的操作忘記釋放鎖導致鎖死,當然這裡一般處理完成都可以手動釋放鎖,然後如果在setnx之後執行expire之前進程意外crash或者要重啟維護,就需要把setnx和expire合成一條指令來用。
我:Redis是單線程的,keys指令會導致線程阻塞一段時間,線上的服務會停頓,知道指令執行完畢,服務才能恢復。相比於scan指令可以無阻塞的提取出指定模式的key列表,但是會有一定的重複概率,在客戶端做一次去重就可以了,但是總體的時間花費是要比keys命令長的。
smembers命令可以返回集合鍵當前包含的所有元素。
對於scan這類增量式迭代命令來說,因為在對鍵進行增量式迭代的過程中,鍵可能會被修改,所以增量式迭代命令只能對被返回值的元素提供有限的保證。
我:首先redis有異步隊列和一個延時隊列,
異步隊列:
1.list結構作為隊列,rpush生產消息。lpop消費消息,當lpop沒有消息的時候,要適當的sleep一會再重試。
2.list還有一個指令叫blpop,在沒有消息的時候,他會阻塞直到消息到來。
3.pub/sub主題訂閱模式,可以實現1:N的消息隊列,實現生產一次,消費多次
4.pub/sub主題訂閱模式,消費者下線的情況下,生產的消息會丟失,得使用專業的消息隊列,如kafka ,rabbitMQ
延時隊列:
sortedset,那時間戳作為score,消息內容作為ke調用zadd來生產消息,消費者用zrangebyscore指令獲取N秒之前的數據輪詢進行處理。
我:首先Redis是支持持久化操作的,這個是毋庸置疑,然後redis的持久化機制有兩種,一種是AOF的方式,一種是RDB的方式做的持久化。
先說說RDB做持久化:RDB做鏡像全量的持久化,AOF做增量持久化,首先因為RDB會耗費較多的時間和資源,不夠實時,在停機的時候回導致大量的丟失數據,所以需要AOF日誌信息來配合使用,首先恢復RDB中的數據,然後用AOF來恢復剩餘的數據,因為RDB數據恢復來說是比較容易的,所以先RDB恢復一部分完整數據。
在redis實例重啟時,會使用RDB持久化文件重新構建內存信息,在使用AOF從放近期的操作指令來實現完整恢復重啟之前的狀態。
然後Redis本身的機制是AOF持久化開啟且存在Aof文件時,有限加載AOF文件;AOF關閉或者AOF文件不存在時,加載RDB文件;加載AOF/RDB文件後,redis啟動成功,AOF/RDB文件存在錯誤時,redis啟動失敗並且列印錯誤信息。
我:AOF日誌的sync屬性的配置,如果不要求性能,在每條指令都sync一下磁碟,就不會丟失數據,但是這在高性能的情況下是不行的,高性能要求sync磁碟一般如果是一秒一次,那麼斷電就會造成一秒的數據丟失。
順便說一下RDB的原理:Fork是指redis用過創建子線程來進行RDB操作,cow指的是copy on write ,子進程創建後,父進程共享數據段,父進程繼續提供讀寫服務,寫髒的頁面數據,會逐漸與子進程分離開來。
pipeline的好處:可以將多次io往返的時間縮短為一次,前提是pipeline執行的指令之間沒有因果關係;
我:Redis有三種集群模式,分別是:
主從模式:主從模式是三種模式中最簡單的,在主從複製中,資料庫分為兩類:主資料庫(master)和從資料庫
主從複製的特點:
工作機制:
當slave啟動後,主動向master發送SYNC命令。master接收到SYNC命令後在後臺保存快照(RDB持久化)和緩存保存快照這段時間的命令,然後將保存的快照文件和緩存的命令發送給slave。slave接收到快照文件和命令後加載快照文件和緩存的執行命令。
複製初始化後,master每次接收到的寫命令都會同步發送給slave,保證主從數據一致性。
缺點:
從上面可以看出,master節點在主從模式中唯一,若master掛掉,則redis無法對外提供寫服務。
Sentinel模式(哨兵模式):
主從模式的弊端就是不具備高可用性,當master掛掉以後,Redis將不能再對外提供寫入操作,因此sentinel應運而生。
sentinel中文含義為哨兵,顧名思義,它的作用就是監控redis集群的運行狀況,特點如下:
工作機制:
Cluster模式:
Cluster模式介紹:
sentinel模式基本可以滿足一般生產的需求,具備高可用性。但是當數據量過大到一臺伺服器存放不下的情況時,主從模式或sentinel模式就不能滿足需求了,這個時候需要對存儲的數據進行分片,將數據存儲到多個Redis實例中。cluster模式的出現就是為了解決單機Redis容量有限的問題,將Redis的數據根據一定的規則分配到多臺機器。
cluster可以說是sentinel和主從模式的結合體,通過cluster可以實現主從和master重選功能,所以如果配置兩個副本三個分片的話,就需要六個Redis實例。因為Redis的數據是根據一定規則分配到cluster的不同機器的,當數據量過大時,可以新增機器進行擴容。
使用集群,只需要將redis配置文件中的cluster-enable配置打開即可。每個集群中至少需要三個主資料庫才能正常運行,新增節點非常方便。
cluster集群特點:
我:RDB:RDB是作為冷備的,RDB持久化機制,是對Redis中的數據執行周期的持久化。
優點:RDB對Redis的性能影響非常的小,是因為在同步數據的時候他只是fork了一個子進程去做持久化的,而他在數據恢復時候的速度比AOF來的塊。
缺點:RDB都是快照文件,都是默認5分鐘甚至更久才會生成一次備份,這就意味著你這次同步到下次同步這中間的數據都很有可能全部丟失,AOF則最多丟失一秒的數據,RDB在生成樹快照的時候,如果文件過大,客戶端肯會暫停幾毫秒到幾秒。
AOF:作為redis的熱備,AOF機制對每條寫入命令作為日誌以append-only 的模式寫入一個日誌文件中
優點:AOF是一秒一次去通過一個後臺的線程fsync操作,那最多丟失這一秒的數據,AOF在對日誌文件進行操作的時候回是以append-only的方式去寫的,他只是追加的方式寫數據,自然少了很多磁碟尋址的開銷。
缺點:對於同一份數據來說,AOF日誌文件通常比RDB數據快照文件更大,恢復速度慢。
我:首先內存淘汰機制即過期策略有:
定期刪除:默認100ms就隨機抽一些過時間的key,去檢查是否過期,過期就刪除
惰性刪除:我不主動刪除,等人來查詢,看看有沒有過期,過期了就刪除,沒有過期就給你返回值。
定期沒有刪除,我也沒有去查詢,怎麼辦? 這就需要淘汰機制的設定。
然後redis和memcache的區別如下:
首先 redis相比memcached來說,擁有跟多的數據結構,能支持更豐富的數據操作。
在redis3.x版本中可以支持cluster模式,而memcached沒有原生的集群模式,需要依賴客戶端來實現往集群中分片寫入數據。
redis只使用單核,而memcached可以使用多核,所以平均每一個核上redis在存儲小數據時比memcached性能更高。
好的,這次redis的面試就到這裡,小夥子很不錯,基本的問題都答出來了,回去等下一次面試消息吧,順便說一下下一次的面試內容會是大數據相關的喲,多複習複習。