這篇文章為大家帶來了關於Redis面試時常被問到的一些問題總結,模擬一下面試官在Redis這個話題上是如何一步一步深入,全面考察候選人對於Redis的掌握情況,希望對大家有幫助。
推薦學習:《2022最新redis面試題大全及答案》
redis面試中常被問到的12個重點
Redis是面試中繞不過的門檻,只要在履歷中寫了用過Redis,肯定逃不過。
小張:
面試官,你好。我是來參加面試的。
面試官:
你好,小張。我看了你的履歷,熟練Redis,那麼我就隨便問你幾個Redis相關的問題吧。首先我的問題是,Redis是單執行緒還是多執行緒呢?
小張:
Redis不同版本之間採用的執行緒模型是不一樣的,在Redis4.0版本之前使用的是單執行緒模型,在4.0版本之後增加了多線程的支援。
在4.0之前雖然我們說Redis是單線程,也只是說它的網路I/O線程以及Set 和 Get操作是由一個線程完成的。但是Redis的持久化、叢集同步還是使用其他執行緒來完成。
4.0之後又增加了多執行緒的支持,主要是體現在大數據的非同步刪除功能上,例如unlink key
、flushdb async
、flushall async
等
面試官:
回答的很好,那為什麼Redis在4.0之前會選擇使用單一執行緒?而且使用單線程還那麼快?
小張:
選擇單線程個人覺得主要是使用簡單,不存在鎖定競爭,可以在無鎖的情況下完成所有操作,不存在死鎖和線程切換帶來的效能和時間上的開銷,但同時單執行緒也無法完全發揮出多核心CPU的效能。
至於為什麼單線程那麼快我覺得主要有以下幾個原因:
Redis 的大部分操作都在記憶體中完成,記憶體中的執行效率本身就很快,並且採用了高效的資料結構,例如哈希表和跳表。
使用單執行緒避免了多執行緒的競爭,省去了多執行緒切換帶來的時間和效能開銷,並且不會出現死鎖。
採用I/O 多工機制處理大量客戶端的Socket請求,因為這是基於非阻塞的I/O 模型,這就讓Redis可以有效率地進行網路通信,I/O的讀寫流程也不再阻塞。
面試官:
不錯,那Redis是如何實現資料不遺失的呢?
小張:
Redis資料是儲存在記憶體中的,為了確保Redis資料不會遺失,那就要把資料從記憶體儲存到磁碟上,以便在伺服器重啟後來也能夠從磁碟中恢復原有數據,這就是Redis的資料持久化。 Redis資料持久化有三種方式。
AOF 日誌(Append Only File,檔案追加方式):記錄所有的操作指令,並以文字的形式追加到檔案中。
RDB 快照(Redis DataBase):將某一個時刻的記憶體數據,以二進位的方式寫入磁碟。
混合持久化方式:Redis 4.0 新增了混合持久化的方式,整合了 RDB 和 AOF 的優點。
面試官:
那你分別說說 AOF和 RDB的實作原則吧。
小張:
AOF採用的是寫後日誌的方式,Redis先執行指令把資料寫入內存,然後再記錄日誌到檔案中。 AOF日誌記錄的是操作指令,不是實際的數據,如果採用AOF方法做故障復原時需要將全量日誌都執行一遍。
RDB採用的是記憶體快照的方式,它記錄的是某一時刻的數據,而不是操作,所以採用RDB方法做故障恢復時只需要直接把RDB檔案讀入記憶體即可,快速恢復。
面試官:
你剛剛提到了AOF採用的是“寫後日誌” 的方式,我們平時用的MySQL則採用的是“寫前日誌”,那 Redis為什麼要先執行指令,再把資料寫入日誌呢?
小張:額頭開始冒汗,問的是些啥問題呀。 。 。
額,這個主要是由於Redis在寫入日誌之前,不對命令進行語法檢查,所以只記錄執行成功的命令,避免出現記錄錯誤命令的情況,而且在命令執行後再寫日誌不會阻塞目前的寫入操作。
面試官:
那 後寫日誌又有什麼風險呢?
小張:
我... 這個我不會。
面試官:
好吧,後寫日誌主要有兩個風險可能會發生:
資料可能會遺失:如果Redis 剛執行完指令,此時發生故障宕機,會導致這條指令有遺失的風險。
可能會阻塞其他動作:AOF 日誌其實也是在主執行緒中執行,所以當 Redis 把日誌檔案寫入磁碟的時候,還是會阻塞後續的操作無法執行。
我還有個問題是 RDB做快照時會阻塞執行緒嗎?
小張:
Redis 提供了兩個指令來產生 RDB 快照文件,分別是 save 和 bgsave。 save 指令在主執行緒中執行,會導致阻塞。而 bgsave 指令則會建立一個子程序,用來寫入 RDB 檔案的操作,避免了對主執行緒的阻塞,這也是 Redis RDB 的預設配置。
面試官:
RDB 做快照的時候資料能修改嗎?
小張:
save是同步的會阻塞客戶端指令,bgsave的時候是可以修改的。
面試官:
那Redis是怎麼解決在bgsave做快照的時候允許資料修改呢?
小張:(你咋還問。。我™不會啊!)
額,這個我不太清楚...
##面試官:這裡主要是利用bgsave的子執行緒實現的,具體操作如下:
bgsave 子程序互相不影響;
bgsave子程序會把該副本資料寫入RDB 文件,在這個過程中,主執行緒仍然可以直接修改原來的資料。
AOF 和RDB 混合的數據持久化機制: 把數據以RDB 的方式寫入文件,再將後續的操作命令以AOF 的格式存入文件,既保證了Redis 重啟速度,又降低數據丟失風險。
小張:學到了學到了。 面試官:那你再跟我說說Redis如何實現高可用吧?
小張:Redis實作高可用主要有三種方式:主從複製、哨兵模式,以及 Redis 叢集。主從複製
將從前面的一個Redis 伺服器,同步資料到多台從Redis 伺服器上,也就是一個主多從的模式,這個跟著MySQL主從複製的原理一樣。哨兵模式
使用Redis 主從服務的時候,會有一個問題,就是當Redis 的主從伺服器出現故障宕機時,需要手動進行恢復,為了解決這個問題,Redis 增加了哨兵模式(因為哨兵模式做到了可以監控主從伺服器,並且提供自動容災恢復的功能)。Redis Cluster(叢集)
Redis Cluster 是分散式去中心化的運作模式,是在Redis 3.0版本中推出的Redis 叢集方案,它將資料分佈在不同的伺服器上,以此來降低系統對單主節點的依賴,從而提高Redis 服務的讀寫效能。那為什麼還要使用叢集模式呢?
小張:額,哨兵模式歸根節點還是主從模式,在主從模式下我們可以透過增加salve節點來擴展讀取並發能力,但是沒辦法擴展寫入能力和儲存能力,儲存能力只能是master節點能夠承載的上限。所以為了擴展寫入能力和儲存能力,我們需要引入叢集模式。 面試官:叢集中這麼多Master節點,redis cluster在儲存的時候如何決定要選擇哪個節點?
小張:這應該是使用了某種hash演算法,但我不太清楚。 。 。 面試官:那好,今天的面試就到這裡吧,你先回去等我們的面試通知。
小張:
好的,謝謝面試官,你能告訴我redis cluster怎麼實現節點選擇的嗎?
面試官:
Redis Cluster採用的是類別一致性雜湊演算法實作節點選擇的,至於什麼是一致性雜湊演算法你自己回去看看。
Redis Cluster將自己分成了16384個Slot(槽位),哈希槽類似於資料分區,每個鍵值對都會根據它的key,被映射到一個哈希槽中,具體執行過程分為兩大步。
根據鍵值對的 key,依照 CRC16 演算法計算一個 16 bit 的值。
再用 16bit 值對 16384 取模,得到 0~16383 範圍內的模數,每個模數代表一個對應編號的哈希槽。
每個Redis節點負責處理一部分插槽,加入你有三個master節點ABC,每個節點負責的插槽如下:
這樣就實作了cluster節點的選擇。
推薦學習:《Redis影片教學》、《2022最新redis面試題大全及答案》
以上是redis面試中常被問到的12個重點(附答案)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

Redis的數據模型和結構包括五種主要類型:1.字符串(String):用於存儲文本或二進制數據,支持原子操作。 2.列表(List):有序元素集合,適合隊列和堆棧。 3.集合(Set):無序唯一元素集合,支持集合運算。 4.有序集合(SortedSet):帶分數的唯一元素集合,適用於排行榜。 5.哈希表(Hash):鍵值對集合,適合存儲對象。

Redis的數據庫方法包括內存數據庫和鍵值存儲。 1)Redis將數據存儲在內存中,讀寫速度快。 2)它使用鍵值對存儲數據,支持複雜數據結構,如列表、集合、哈希表和有序集合,適用於緩存和NoSQL數據庫。

Redis是一個強大的數據庫解決方案,因為它提供了極速性能、豐富的數據結構、高可用性和擴展性、持久化能力以及廣泛的生態系統支持。 1)極速性能:Redis的數據存儲在內存中,讀寫速度極快,適合高並發和低延遲應用。 2)豐富的數據結構:支持多種數據類型,如列表、集合等,適用於多種場景。 3)高可用性和擴展性:支持主從復制和集群模式,實現高可用性和水平擴展。 4)持久化和數據安全:通過RDB和AOF兩種方式實現數據持久化,確保數據的完整性和可靠性。 5)廣泛的生態系統和社區支持:擁有龐大的生態系統和活躍社區,

Redis的關鍵特性包括速度、靈活性和豐富的數據結構支持。 1)速度:Redis作為內存數據庫,讀寫操作幾乎瞬時,適用於緩存和會話管理。 2)靈活性:支持多種數據結構,如字符串、列表、集合等,適用於復雜數據處理。 3)數據結構支持:提供字符串、列表、集合、哈希表等,適合不同業務需求。

Redis的核心功能是高性能的內存數據存儲和處理系統。 1)高速數據訪問:Redis將數據存儲在內存中,提供微秒級別的讀寫速度。 2)豐富的數據結構:支持字符串、列表、集合等,適應多種應用場景。 3)持久化:通過RDB和AOF方式將數據持久化到磁盤。 4)發布訂閱:可用於消息隊列或實時通信系統。

Redis支持多種數據結構,具體包括:1.字符串(String),適合存儲單一值數據;2.列表(List),適用於隊列和棧;3.集合(Set),用於存儲不重複數據;4.有序集合(SortedSet),適用於排行榜和優先級隊列;5.哈希表(Hash),適合存儲對像或結構化數據。

Redis計數器是一種使用Redis鍵值對存儲來實現計數操作的機制,包含以下步驟:創建計數器鍵、增加計數、減少計數、重置計數和獲取計數。 Redis計數器的優勢包括速度快、高並發、持久性和簡單易用。它可用於用戶訪問計數、實時指標跟踪、遊戲分數和排名以及訂單處理計數等場景。

使用 Redis 命令行工具 (redis-cli) 可通過以下步驟管理和操作 Redis:連接到服務器,指定地址和端口。使用命令名稱和參數向服務器發送命令。使用 HELP 命令查看特定命令的幫助信息。使用 QUIT 命令退出命令行工具。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

Atom編輯器mac版下載
最受歡迎的的開源編輯器

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

WebStorm Mac版
好用的JavaScript開發工具