日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

单线程多线程_面试系列 redis为什么快amp;单线程amp;多线程

發布時間:2025/3/15 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 单线程多线程_面试系列 redis为什么快amp;单线程amp;多线程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

redis為什么這么快

  • C語言實現,執行速度快
  • 純內存操作,數據讀寫在內存中,異步持久化到磁盤
  • 豐富和高效的數據結構
  • 基于非阻塞的I/O多路復用機制
  • 單線程避免了上下文切換
  • Redis單線程

    redis單線程的核心就是它基于一個假設:它在內存中執行的操作耗時很快,以至于多線程帶來的收益小于其上下文切換和鎖管理的消耗。

    redis 核心就是 如果我的數據全都在內存里,我單線程的去操作 就是效率最高的,為什么呢,因為多線程的本質就是 CPU 模擬出來多個線程的情況,這種模擬出來的情況就有一個代價,就是上下文的切換,對于一個內存的系統來說,它沒有上下文的切換就是效率最高的。redis 用 單個CPU 綁定一塊內存的數據,然后針對這塊內存的數據進行多次讀寫的時候,都是在一個CPU上完成的,所以它是單線程處理這個事。在內存的情況下,這個方案就是最佳方案 —— 阿里 沈詢
    • redis 用 單個CPU 綁定一塊內存的數據,針對這塊內存的數據進行多次讀寫的時候,都是在一個CPU上完成。對于多個CPU的機器可以使用多個redis實例綁定不同的CPU
    • redis的單線程模型指的是文件事件處理器單線程,即單線程的處理請求。但是它也有自己的一些后臺線程,比如說刪除大key
    • 并行與并發區別 :
      • 并行是為了快,多臺處理器上同時處理多個任務
      • 并發是為了能夠同一時間間隔做多個事情,一臺處理器上“同時”處理多個任務,它一定是慢過串行

    redis的單線程模型/通信流程

    核心就兩大塊,IO多路復用模塊支撐高并發請求,文件事件處理器單線程從隊列中獲取socket并調用相應的請求處理器

    1、首先在redis啟動初始化的時候,redis會先將事件處理器中的連接應答處理器和AE_READABLE事件關聯起來;

    2、如果客戶端向redis發起連接,會產生AE_READABLE事,產生該事件后會被IO多路復用程序監聽到(步驟B),然后IO多路復用程序會把監聽到的socket信息放入到隊列中(步驟C),事件分配器每次從隊列中取出一個socket(步驟D),然后事件分派器把socket給對應的事件處理器(步驟E)。

    3、當客戶端向redis發生寫請求時,首先就會在對應的socket如socket01上會產生AE_READABLE事件,產生該事件后會被IO多路復用程序監聽到(步驟B),然后IO多路復用程序會把監聽到的socket信息放入到隊列中,事件分配器每次從隊列中取出一個socket(步驟D),然后事件分派器把socket給對應的事件處理器(步驟E)。

    5、當客戶端會查詢redis是否完成相應的操作,就會在socket01上產生一個AE_WRITABLE事件,會由對應的命令回復處理器來處理,就是將準備好的相應數據寫入socket01(由于socket連接是雙向的),返回給客戶端,如讀操作,客戶端會顯示ok。

    6、如果命令回復處理器執行完成后,就會刪除這個socket01的AE_WRITABLE事件和命令回復處理器的關聯。

    7、這樣客戶端就和redis進行了一次通信。由于連接應答處理器執行一次就夠了,如果客戶端再次進行操作就會由命令請求處理器來處理,反復執行。

    Redis底層IO模型代碼封裝

    我感覺不會問,但是阿里面經有,先放著先。

    芋道源碼:為什么 Redis 單線程能支撐高并發?

    Redis6.0多線程

    redis單線程的核心就是它基于一個假設:它在內存中執行的操作耗時很快,以至于多線程帶來的收益小于其上下文切換和鎖管理的消耗。

    而現在這個假設在真實場景下發生了瓶頸:網絡IO消耗,當value比較大時:

    • 從socket中讀取請求數據,會從內核態將數據拷貝到用戶態 (read調用)
    • 將數據回寫到socket,會將數據從用戶態拷貝到內核態 (write調用)

    解決方案:

  • 主線程負責接收建立連接請求,獲取 socket 放入全局等待讀處理隊列
  • 主線程接收完所有讀事件之后,通過 RR(Round Robin) 將這些連接分配給 IO 線程組
  • 主線程阻塞等待 IO 線程組讀取 socket 完畢
  • 主線程通過單線程的方式執行請求命令(指客戶端發送的命令),請求數據讀取并解析完成
  • 主線程阻塞等待 IO 線程組將數據回寫 socket 完畢
  • 解除綁定,清空等待隊列
    • 命令的執行依然由主線程單線程串行順序執行(保持單線程)
    • I/O線程要么同時讀,要么同時寫,不會同時讀或寫
    • IO 線程只負責讀寫 socket 解析命令,不負責命令處理
    • 整個過程無鎖參與
    • 多線程肯定要低于機器CPU核數,并行才能提高性能,并發只會浪費

    為什么之前不使用多線程?

    官方曾經回應:使用Redis時,幾乎不存在CPU成為瓶頸的情況, Redis主要受限于內存和網絡。引入多線程,引入了程序執行順序的不確定性,帶來了并發讀寫的一系列問題,增加了系統復雜度、同時可能存在線程切換、甚至加鎖解鎖、死鎖造成的性能損耗。

    那為什么現在又要用多線程了呢?

    因為現在業務場景越來越復雜,對性能要求越來越高,所以對redis做出了提高性能的要求

    整理來源

    單線程模型講解

    單線程模型講解

    redis6.0

    redis6.0多線程

    總結

    以上是生活随笔為你收集整理的单线程多线程_面试系列 redis为什么快amp;单线程amp;多线程的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。