Redis 高级特性(4)— 单线程架构
Redis 使用了單線程架構和 I/O 多路復用模型來實現高性能的內存數據庫服務。
1. 單線程模型
開啟三個 redis-cli 客戶端同時執行命令。客戶端 1 設置一個字符串鍵值對:
127.0.0.1:6379> set hello world
客戶端 2 對 counter 做自增操作:
127.0.0.1:6379> incr counter
客戶端 3 對 counter 做自增操作:
127.0.0.1:6379> incr counter
Redis 客戶端與服務端的模型可以簡化成下圖,每次客戶端調用都經歷了發送命令、執行命令、返回結果三個過程。
其中第 2 步是重點要討論的,因為 Redis 是單線程來處理命令的,所以一條命令從客戶端達到服務端不會立刻被執行,所有命令都會進入一個隊列中,然后逐個被執行。
所以上面 3 個客戶端命令的執行順序是不確定的,如下圖所示。但是可以確定不會有兩條命令被同時執行
所以兩條 incr 命令無論怎么執行最終結果都是 2,不會產生并發問題,這就是 Redis 單線程的基本模型。
Redis 是單線程的。那么為什么說是單線程呢?Redis 在 Reactor 模型內開發了事件處理器,這個事件處理器分為多個 Socket(套接字)、IO 多路復用程序、事件分派器、事件處理器(連接應答處理器、命令請求處理器、命令回復處理器),其中事件派發器的隊列是由單線程的事件處理器消費的,也是因為這個,Redis 才叫單線程模型。
當多個事件并發出現時,I/O 多路復用程序將監聽到的所有 Socket,關聯不同的事件處理器,這個關聯操作以有序(sequentially)、同步(synchronously)、每次一個套接字的方式向事件分派器傳送 Socket:當上一個套接字產生的事件被處理完畢之后,I/O 多路復用程序才會繼續向事件分派器傳送下一個套接字。
2. 為什么單線程還能如此快
為什么 Redis 使用單線程模型會達到每秒萬級別的處理能力呢?可以將其歸結為三點:
- 純內存訪問,Redis 將所有數據放在內存中,內存的響應時長大約為 100 納秒,這是 Redis 達到每秒萬級別訪問的重要基礎。
- 非阻塞 I/O,Redis 使用 epoll 作為 I/O 多路復用技術的實現,再加上 Redis 自身的事件處理模型將 epoll 中的連接、讀寫、關閉都轉換為件,不在網絡 I/O 上浪費過多的時間。
- 單線程避免了線程切換和競態產生的消耗。
單線程能帶來幾個好處:
- 單線程可以簡化數據結構和算法的實現。如果對高級編程語言熟悉的讀者應該了解并發數據結構實現不但困難而且開發測試比較麻煩。
- 單線程避免了線程切換和競態產生的消耗,對于服務端開發來說,鎖和線程切換通常是性能殺手。
但是單線程會有一個問題:對于每個命令的執行時間是有要求的。如果某個命令執行過長,會造成其他命令的阻塞,對于 Redis 這種高性能的服務來說是致命的,所以 Redis 是面向快速執行場景的數據庫。
本文摘自 《Redis 開發運維》
總結
以上是生活随笔為你收集整理的Redis 高级特性(4)— 单线程架构的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Redis 高级特性(3)—— 持久化及
- 下一篇: 2019.01-02 总结