Redis之單執行緒模型
阿新 • • 發佈:2018-11-19
Redis客戶端對服務端的每次呼叫都經歷了傳送命令,執行命令,返回結果三個過程。其中執行命令階段,由於Redis是單執行緒來處理命令的,所有每一條到達服務端的命令不會立刻執行,所有的命令都會進入一個佇列中,然後逐個被執行。並且多個客戶端傳送的命令的執行順序是不確定的。但是可以確定的是不會有兩條命令被同時執行,不會產生併發問題,這就是Redis的單執行緒基本模型。
redis的多路複用選擇器
在IO方面由於是單執行緒,所以為了提高IO的效率,使用了多路複用的IO模型,Redis 基於 Reactor 模式開發了自己的網路事件處理器: 這個處理器被稱為檔案事件處理器(file event handler):
-
檔案事件處理器使用 I/O 多路複用(multiplexing)程式來同時監聽多個套接字, 並根據套接字目前執行的任務來為套接字關聯不同的事件處理器。
-
當被監聽的套接字準備好執行連線應答(accept)、讀取(read)、寫入(write)、關閉(close)等操作時, 與操作相對應的檔案事件就會產生, 這時檔案事件處理器就會呼叫套接字之前關聯好的事件處理器來處理這些事件。
單執行緒模型每秒萬級別處理能力的原因
- 純記憶體訪問。資料存放在記憶體中,記憶體的響應時間大約是100納秒,這是Redis每秒萬億級別訪問的重要基礎。
- 非阻塞I/O,Redis採用epoll做為I/O多路複用技術的實現,再加上Redis自身的事件處理模型將epoll中的連線,讀寫,關閉都轉換為了事件,不在I/O上浪費過多的時間。
- 單執行緒避免了執行緒切換和競態產生的消耗。
- Redis採用單執行緒模型,每條命令執行如果佔用大量時間,會造成其他執行緒阻塞,對於Redis這種高效能服務是致命的,所以Redis是面向高速執行的資料庫。
- Redis為了高效的處理客戶端的事件,並沒有將持久化檔案放在主執行緒裡面進行處理,而是Redis在適當的時機fork子程序來非同步的處理這種任務,Redis會fork子程序進行處理持久化檔案操作(將資料寫到RDB 檔案中)。Redis還有一組非同步任務處理執行緒,用於處理不需要主執行緒同步處理的工作,即處理一些低級別的事件(AOF檔案重寫)。