本篇重點

三個問題:

“Redis真的只有單執行緒嗎?”
“為什麼用單執行緒?”
“單執行緒為什麼這麼快?”

  1. “Redis真的只有單執行緒嗎?”
  • 否,“單執行緒”指的是Redis的網路IO和鍵值對讀寫是由一個執行緒完成的[1]
  • Redis的其他功能由額外執行緒完成:持久化、非同步刪除、叢集資料同步等
  • 網路IO和鍵值對讀寫即Socket程式設計中的如下步驟
    • 網路IO:bind/listen、accept、parse、send/recv
    • KV讀寫:GET/PUT...

  1. “Redis為什麼用單執行緒?”
  • 多執行緒的開銷:共享資源的併發訪問控制,互斥鎖等待,導致並轉串
  1. “單執行緒Redis為什麼那麼快?”
  • 大部分操作在記憶體完成(硬體速度)
  • 高效資料結構(雜湊表、跳錶等)
  • IO多路複用機制:使其在網路IO中能併發處理大量客戶端請求,實現高吞吐率
  1. 多路複用機制

網路操作的基本IO模型、潛在阻塞點(Redis採用單執行緒IO,若被阻塞將無法進行多路複用)

  • 基本IO模型:

  • 阻塞點:accept()、recv()、send()

  • Socket網路模型本身支援非阻塞模式

呼叫方法 返回套接字型別 非阻塞模式 效果
socket() 主動套接字
listen() 監聽套接字 可設定 accept()非阻塞
accept() 已連線套接字 可設定 send()/recv()非阻塞
  1. 基於多路複用的高效能IO模型
  • Linux多路複用機制——一個執行緒處理多個IO流,如select/epoll
  • 基於多路複用的Redis高效能IO模型
  • 在請求到達時,如何通知到Redis執行緒?

    基於事件的回撥機制(select/epoll提供)
    事件被放入事件佇列,Redis單執行緒對該事件佇列進行處理。

QA


“Redis基本IO模型”中的潛在效能瓶頸?

圖片來源於極客時間專欄《Redis核心技術與實戰》


  1. Redis6.0開始,將網路IO和鍵值對讀寫分開處理——網路請求解析執行緒(支援網路快速讀寫)、讀寫處理(主執行緒)