Redis -- 高頻面試題

1. Redis 默認數據庫數量

默認16個數據庫,類似數組下標從0開始,初始默認使用0號庫

統一密碼管理,所有庫都是同樣密碼,要麼都OK要麼一個也連接不上。

2. Redis是單線程的,爲什麼那麼快

1)完全基於內存,絕大部分請求是純粹的內存操作,非常快速。

2)數據結構簡單,對數據操作也簡單,Redis中的數據結構是專門進行設計的

3)採用單線程,避免了不必要的上下文切換和競爭條件,也不存在多進程或者多線程導致的切換而消耗 CPU,不
用去考慮各種鎖的問題,不存在加鎖釋放鎖操作,沒有因爲可能出現死鎖而導致的性能消耗

4)使用多路I/O複用模型,非阻塞IO

 多路複用是指使用一個線程來檢查多個文件描述符(Socket)的就緒狀態,比如調用select和poll和epoll函
 數,傳入多個文件描述符,如果有一個文件描述符就緒,則返回,否則阻塞直到超時。得到就緒狀態後進行真正
 的操作可以在同一個線程裏執行,也可以啓動線程執行(比如使用線程池)。

5)使用底層模型不同,它們之間底層實現方式以及與客戶端之間通信的應用協議不一樣,Redis直接自己構建了
VM 機制 ,因爲一般的系統調用系統函數的話,會浪費一定的時間去移動和請求

3. 原子性

所謂原子操作是指不會被線程調度機制打斷的操作;這種操作一旦開始,就一直運行到結束,中間不會有任何 
context switch (切換到另一個線程)。

(1) 在單線程中, 能夠在單條指令中完成的操作都可以認爲是" 原子操作",因爲中斷只能發生於指令之間。

(2)在多線程中,不能被其它進程(線程)打斷的操作就叫原子操作。

Redis單命令的原子性主要得益於Redis的單線程

4. List

1) 單鍵多值

2) Redis 列表是簡單的字符串列表,按照插入順序排序。你可以添加一個元素到列表的頭部(左邊)或者尾部(右邊)。

3) 它的底層實際是個雙向鏈表,對兩端的操作性能很高,通過索引下標的操作中間的節點性能會較差。

在這裏插入圖片描述

5. Redis的事務定義

Redis事務是一個單獨的隔離操作:事務中的所有命令都會序列化、按順序地執行。事務在執行的過程中,不會被其他客戶端發送來的命令請求所打斷。

Redis事務的主要作用就是串聯多個命令防止別的命令插隊

6. Multi、Exec、discard

1)  從輸入Multi命令開始,輸入的命令都會依次進入命令隊列中,但不會執行,至到輸入Exec後,Redis會將之前的命令隊列中的命令依次執行。

2) 組隊的過程中可以通過discard來放棄組隊。  

在這裏插入圖片描述
組隊中某個命令出現了報告錯誤,執行時整個的所有隊列會都會被取消。

在這裏插入圖片描述

如果執行階段某個命令報出了錯誤,則只有報錯的命令不會被執行,而其他的命令都會執行,不會回滾。

在這裏插入圖片描述

7. 悲觀鎖和樂觀鎖

悲觀鎖(Pessimistic Lock), 顧名思義,就是很悲觀,每次去拿數據的時候都認爲別人會修改,所以每次在拿
數據的時候都會上鎖,這樣別人想拿這個數據就會block直到它拿到鎖。傳統的關係型數據庫裏邊就用到了很多
這種鎖機制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖。

樂觀鎖(Optimistic Lock), 顧名思義,就是很樂觀,每次去拿數據的時候都認爲別人不會修改,所以不會上鎖,
但是在更新的時候會判斷一下在此期間別人有沒有去更新這個數據,可以使用版本號等機制。樂觀鎖適用於多讀的
應用類型,這樣可以提高吞吐量。Redis就是利用這種check-and-set機制實現事務的。

8. WATCH 與 unwatch

  Watch : 在執行multi之前,先執行watch key1 [key2],可以監視一個(或多個) key ,如果在事務執行之前
  這個(或這些) key 被其他命令所改動,那麼事務將被打斷。

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-BAImhk0R-1590903285067)(file:///C:\Users\PANSHU~1\AppData\Local\Temp\ksohtml28768\wps5.jpg)]

Unwatch : 

1)取消 WATCH 命令對所有 key 的監視。

2)如果在執行 WATCH 命令之後, EXEC 命令或 DISCARD 命令先被執行了的話,那麼就不需要再執行 UNWATCH 了。

9. 三特性

1) 單獨的隔離操作

	事務中的所有命令都會序列化、按順序地執行。事務在執行的過程中,不會被其他客戶端發送來的命令請求所打斷。 

2) 沒有隔離級別的概念

	隊列中的命令沒有提交之前都不會實際的被執行,因爲事務提交前任何指令都不會被實際執行,也就不存在
“事務內的查詢要看到事務裏的更新,在事務外查詢不能看到”這個讓人萬分頭痛的問題 

3) 不保證原子性

	Redis同一個事務中如果有一條命令執行失敗,其後的命令仍然會被執行,沒有回滾 

10. 數據持久化

1)RDB持久化:

① 在指定的時間間隔內持久化

② 服務shutdown會自動持久化

③ 輸入bgsave也會持久化

優點:

1. 節省磁盤空間

2. 恢復速度快

缺點:

1. 雖然Redis在fork時使用了寫時拷貝技術,但是如果數據龐大時還是比較消耗性能。

2. 在備份週期在一定間隔時間做一次備份,所以如果Redis意外down掉的話,就會丟失最後一次快照後的所有修改。

2)AOF :  以日誌形式記錄每個更新操作

Redis重新啓動時讀取這個文件,重新執行新建、修改數據的命令恢復數據。

保存策略:

推薦(並且也是默認)的措施爲每秒持久化一次,這種策略可以兼顧速度和安全性。

優點:

備份機制更穩健,丟失數據概率更低。

可讀的日誌文本,通過操作AOF穩健,可以處理誤操作。

缺點:

1 比起RDB佔用更多的磁盤空間

2 恢復備份速度要慢

3 每次讀寫都同步的話,有一定的性能壓力

4 存在個別Bug,造成恢復不能

11. 主從複製

主從複製,就是主機數據更新後根據配置和策略,自動同步到備機的master/slaver機制,Master以寫爲主,Slave以讀爲主

在這裏插入圖片描述

用處 :

1. 讀寫分離,性能擴展

2. 容災快速恢復

12. 薪火相傳

1) 上一個slave可以是下一個slave的Master,slave同樣可以接收其他slaves的連接和同步請求,那麼該slave
作爲了鏈條中下一個的master, 可以有效減輕master的寫壓力,去中心化降低風險。

2) 用 slaveof  <ip>  <port>

3) 中途變更轉向:會清除之前的數據,重新建立拷貝最新的

4) 風險是一旦某個slave宕機,後面的slave都沒法備份

在這裏插入圖片描述

13. 哨兵模式(sentinel)

如果主機Down掉,哨兵會從從機中選擇一臺作爲主機,並將它設置爲其他從機的主機,而且如果原來的主機再次
啓動的話也會成爲從機。

14. 什麼是Redis集羣

1. Redis 集羣實現了對Redis的水平擴容,即啓動N個redis節點,將整個數據庫分佈存儲在這N個節點中,每個節點
存儲總數據的1/N。

2. Redis 集羣通過分區(partition)來提供一定程度的可用性(availability): 即使集羣中有一部分節點失效
或者無法進行通訊, 集羣也可以繼續處理命令請求。

15. 什麼是slots

1. 一個 Redis 集羣包含 16384 個插槽(hash slot), 數據庫中的每個鍵都屬於這 16384 個插槽的其中
一個, 集羣使用公式 CRC16(key) % 16384 來計算鍵 key 屬於哪個槽, 其中 CRC16(key) 語句用於計算鍵 
key 的 CRC16 校驗和 。

2. 集羣中的每個節點負責處理一部分插槽。

16. Redis集羣的好處:

1.實現擴容

2.分攤壓力

3.無中心配置相對簡單

17. Redis集羣的不足:

1. 多鍵操作是不被支持的 

2. 多鍵的Redis事務是不被支持的。lua腳本不被支持。

3. 由於集羣方案出現較晚,很多公司已經採用了其他的集羣方案,而代理或者客戶端分片的方案想要遷移至redis cluster,需要整體遷移而不是逐步過渡,複雜度較大。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章