本篇重點
三個問題:
“Redis真的只有單執行緒嗎?”
“為什麼用單執行緒?”
“單執行緒為什麼這麼快?”
- “Redis真的只有單執行緒嗎?”
- 否,“單執行緒”指的是Redis的網路IO和鍵值對讀寫是由一個執行緒完成的[1]
- Redis的其他功能由額外執行緒完成:持久化、非同步刪除、叢集資料同步等
- 網路IO和鍵值對讀寫即Socket程式設計中的如下步驟
- 網路IO:bind/listen、accept、parse、send/recv
- KV讀寫:GET/PUT...
- “Redis為什麼用單執行緒?”
- 多執行緒的開銷:共享資源的併發訪問控制,互斥鎖等待,導致並轉串
- “單執行緒Redis為什麼那麼快?”
- 大部分操作在記憶體完成(硬體速度)
- 高效資料結構(雜湊表、跳錶等)
- IO多路複用機制:使其在網路IO中能併發處理大量客戶端請求,實現高吞吐率
- 多路複用機制
網路操作的基本IO模型、潛在阻塞點(Redis採用單執行緒IO,若被阻塞將無法進行多路複用)
基本IO模型:
阻塞點:
accept()、recv()、send()
Socket網路模型本身支援非阻塞模式
呼叫方法 | 返回套接字型別 | 非阻塞模式 | 效果 |
---|---|---|---|
socket() | 主動套接字 | ||
listen() | 監聽套接字 | 可設定 | accept()非阻塞 |
accept() | 已連線套接字 | 可設定 | send()/recv()非阻塞 |
- 基於多路複用的高效能IO模型
- Linux多路複用機制——一個執行緒處理多個IO流,如
select/epoll
- 基於多路複用的Redis高效能IO模型
- 在請求到達時,如何通知到Redis執行緒?
基於事件的回撥機制(select/epoll提供)
事件被放入事件佇列,Redis單執行緒對該事件佇列進行處理。
QA
“Redis基本IO模型”中的潛在效能瓶頸?
圖片來源於極客時間專欄《Redis核心技術與實戰》
Redis6.0開始,將網路IO和鍵值對讀寫分開處理——網路請求解析執行緒(支援網路快速讀寫)、讀寫處理(主執行緒) ︎