单线程多线程_面试系列 redis为什么快amp;单线程amp;多线程
redis為什么這么快
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調用)
解決方案:
- 命令的執行依然由主線程單線程串行順序執行(保持單線程)
- I/O線程要么同時讀,要么同時寫,不會同時讀或寫
- IO 線程只負責讀寫 socket 解析命令,不負責命令處理
- 整個過程無鎖參與
- 多線程肯定要低于機器CPU核數,并行才能提高性能,并發只會浪費
為什么之前不使用多線程?
官方曾經回應:使用Redis時,幾乎不存在CPU成為瓶頸的情況, Redis主要受限于內存和網絡。引入多線程,引入了程序執行順序的不確定性,帶來了并發讀寫的一系列問題,增加了系統復雜度、同時可能存在線程切換、甚至加鎖解鎖、死鎖造成的性能損耗。
那為什么現在又要用多線程了呢?
因為現在業務場景越來越復雜,對性能要求越來越高,所以對redis做出了提高性能的要求
整理來源
單線程模型講解
單線程模型講解
redis6.0
redis6.0多線程
總結
以上是生活随笔為你收集整理的单线程多线程_面试系列 redis为什么快amp;单线程amp;多线程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 腐蚀rust研究台抽奖_中石化青岛安工院
- 下一篇: java 多线程两种方式_JAVA多线程