什么是redis的單線程?redis為什么用單線程?為什么單線程redis能那么快?下面本篇文章給大家分析分析,希望對大家有所幫助!
1.基本概念
-
什么是redis的單線程(核心功能在單線程上,并不是所有功能)
-
redis的網絡IO和鍵值對讀寫是由一個線程完成的(redis的核心服務)
-
redis的其他功能由額外線程完成
- 持久化
- 異步刪除
- 集群數據同步
-
【相關推薦:redis】
2.redis為什么用單線程
-
多線程的開銷
-
使用多線程可以增加系統吞吐率(每個請求),增加系統擴展性
-
無限的增加線程數,導致吞吐量下降
- 被多線程同時訪問共享資源,比如共享的數據結構
- 為了保證線程安全,導致性能的犧牲
- 粗粒度的鎖導致所有串行,系統的吞吐率隨著線程的增加而增加
-
-
因此為了節省并發資源的管理,redis使用單線程,保證所有操作串行化
3.單線程的redis為什么快
- redis大部分操作都在內存上+高效的數據結構
- redis采用多路復用機制,在網絡中處理大量客戶端請求,實現高吞吐率
4.socket
-
socket通信過程(網絡IO處理+鍵值對讀寫+網絡IO處理)
- SimpleKV 為了處理一個 Get 請求
- 需要監聽客戶端請求(bind/listen)
- 和客戶端(代碼)建立連接(accept)
- 從 socket 中讀取請求(recv)
- 解析客戶端發送請求(parse)
- 根據請求類型讀取鍵值數據(get)
- 最后給客戶端返回結果,即向 socket 中寫回數據(send)
-
潛在的阻塞點
-
accept() 未能成功建立連接時,會一直阻塞
-
recv() 從客戶端讀取數據時,會一直阻塞
-
- socket的非阻塞模式
- 保證 Redis 線程,既不會像基本 IO 模型中一直在阻塞點等待,也不會導致 Redis 無法處理實際到達的連接請求或數據
- Linux 中的 IO 多路復用機制
5.多路復用
-
Linux中的IO多路復用機制指一個線程處理多個IO流,select/poll
-
在單線程下,同時存在監聽多個套接字和已連接套接字
-
具體實現
-
FD是多個套接字
-
Redis使用epoll機制,讓內核監聽套接字
-
Redis可以和多個客戶端連接并處理請求,從而提升并發性
-
select/epoll提供了基于事件的回調機制,針對不同的事件調用對應的處理函數
- 首先將事件放入事件隊列,無需潤徐請求是否實際發生,避免CPU資源浪費
- 根據相應的事件執行響應的操作
-
6.總結
-
redis真的是單線程嗎
- 對網絡 IO 和數據讀寫的操作采用了一個線程。
-
為什么用單線程
- 避免多線程開發的并發控制問題。
- 多路復用的 IO 模型密切相關。
-
單線程為什么這么快
更多編程相關知識,請訪問:redis!!
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END
喜歡就支持一下吧
相關推薦