《redis》4-redis是單執行緒?
江湖傳言,redis是單執行緒的,習慣了多執行緒高併發的高大上基數架構之後,猛然回頭,發現支援三高的redis是單執行緒的,這個你能信?
“單執行緒”描述redis固然不準確,我們只能說,redis在訪問儲存部分的時候是單執行緒的。
學習過tomcat的應該清楚,tomcat跟redis的架構有些類似。
tomcat有個專門處理connector的聯結器,可以同時處理N個請求,但是connector在提交請求到容器部分的時候,提交的其實是runner,tomcat的自己的執行緒池會持續處理提交的runner,執行結果返回給response。這也是為什麼tomcat能夠併發處理多請求的基礎。
redis的基礎模組中,
我們也總結道redis存在一個訪問模組,在我們的實際環境中,
- redis服務處理socket請求,多臺伺服器同時請求redis服務,也是跟tomcat一樣,使用多路複用IO模型
- 請求被提交到操作模組的時候,會把請求抽象成task,放入請求佇列,但是隻有一個執行緒處理task。也就是說,生產者消費者模式中,只有一個消費者。跟tomcat的執行緒池的多執行緒的區別就在這裡
- 把請求的結果返回給response
這個時候我們其實可以關注三個點
- 處理訪問請求的I/O模型-多路複用
- 生產者消費者模式
- 單執行緒和執行緒池的優缺點
I/O模型,就是作業系統處理I/O硬體的模型,主要有5中
- 同步阻塞操作模型
- 同步非阻塞操作模型
- 多路複用模型
- 非同步模型
- 訊號驅動模型
現在java中多使用多路複用模型,即Redis中使用的模型。他們的主要區別就是,在使用者執行緒(redis的訪問模組中的請求處理執行緒或者tomcat中connector中的請求處理執行緒),在處理socket的內容時的是否同步和是否阻塞。
簡單的同步阻塞模型,比如我們需要讀取socket的請求內容,這麼一個簡單的操作,使用者執行緒需要等待核心執行緒把資料從io外部裝置copy到核心,然後再從核心copy到使用者執行緒空間,這樣的速度是緩慢的,使用者執行緒需要同步等待並阻塞,直到這一整個過程結束。
在學習tomcat的時候,李號雙老師總結了一下上面的4中IO模型。我們比較關注多路複用模型。
上面是簡單的多路複用模型,在使用者執行緒中,
- 有一個單獨的執行緒在迴圈中呼叫select方法,查詢socket中已經做了資料準備的連結
- select方法查到準備好的socket,然後經過一些列操作,把socket的操作提取成task,放入佇列
- 使用者另外的執行緒,處理task佇列中的task。
多路服用的特點就是可以處理很多socket。
上面的task列表和執行緒處理task列表中的task就是生產者和消費者模式
那我們在redis中的消費者,即執行task的執行緒只有一個執行緒,所以redis是單執行緒。tomcat卻有一個執行緒池,執行緒池中有多個執行緒一起消費task列表。
為什麼tomcat和redis選擇了不同的路線呢?這跟tomcat和redis處理的業務場景有關,tomcat在啟動分web服務中,很多請求需要請求資料庫,檔案伺服器等,這些又是一些外部裝置,操作時間常,cpu利用率低,所以可以多執行緒,增加吞吐量。
優點:但是redis是記憶體儲存服務,只需要訪問記憶體就能範圍,而且大部分內容訪問時間複雜度是O(1),所以處理訪問的時間非常短,不需要執行緒等待太長時間,單個執行緒還可以避免多執行緒併發造成的死鎖問題,還可以避免執行緒上下文切換造成的時間消耗。
缺點:但是單執行緒處理也有個問題,如果task佇列中出現一個複雜訪問,比如說訪問時間是1s,那麼佇列後面的任務都要阻塞到該任務執行完。
但是redis不僅有記憶體訪問模組一個功能,主從同步的時候,也有單獨的執行緒。持久化的時候,也有單獨的執行緒。這些功能性的執行緒也一起為redis的高可用提供的了支撐
相關文章
- redis自學(22)Redis是單執行緒還是多執行緒?Redis執行緒
- redis 單執行緒Redis執行緒
- 面試官問,Redis 是單執行緒還是多執行緒?我懵了面試Redis執行緒
- Redis-單執行緒Redis執行緒
- Redis--單執行緒Redis執行緒
- Redis是單執行緒的,但Redis為什麼這麼快?Redis執行緒
- redis為什麼用單執行緒不用多執行緒Redis執行緒
- Redis之單執行緒 Reactor 模型Redis執行緒React模型
- redis是單執行緒的,為什麼這麼快Redis執行緒
- 面試時說Redis是單執行緒的,被噴慘了!面試Redis執行緒
- 面試官:你確定 Redis 是單執行緒的程式嗎?面試Redis執行緒
- 關於redis單執行緒的分析Redis執行緒
- Redis篇:單執行緒I/O模型Redis執行緒模型
- 【Redis破障之路】三:Redis單執行緒架構Redis執行緒架構
- redis執行緒模型Redis執行緒模型
- 執行緒1-單執行緒執行緒
- 單執行緒Redis效能為何如此之高?執行緒Redis
- 單執行緒的Redis有哪些慢動作?執行緒Redis
- Redis 網路架構及單執行緒模型Redis架構執行緒模型
- Redis單執行緒,為什麼速度快Redis執行緒
- Redis的執行緒模型Redis執行緒模型
- 為什麼redis是單執行緒的以及為什麼這麼快?Redis執行緒
- Redis為什麼是單執行緒?為什麼有如此高的效能?Redis執行緒
- 單執行緒的js是如何工作的執行緒JS
- Javascript是單執行緒的深入分析JavaScript執行緒
- 《【面試突擊】— Redis篇》-- Redis的執行緒模型瞭解嗎?為啥單執行緒效率還這麼高?面試Redis執行緒模型
- 阿里一面:Redis是單執行緒,這樣回答,面試官口水直流....阿里Redis執行緒面試
- 24. 一個普通main方法的執行,是單執行緒模式還是多執行緒模式?為什麼?AI執行緒模式
- 程式執行緒新解:什麼是程式?什麼是執行緒?執行緒
- 瀏覽器多執行緒和js單執行緒瀏覽器執行緒JS
- Redis執行緒模型的前世今生Redis執行緒模型
- (三)Redis 執行緒與IO模型Redis執行緒模型
- JavaScript單執行緒概念JavaScript執行緒
- Redis作為單執行緒 為什麼我用它還是出現了超賣呢?Redis執行緒
- 多執行緒Demo學習(執行緒的同步,簡單的執行緒通訊)執行緒
- SingleThreadExecutor(單執行緒執行器)thread執行緒
- 什麼是執行緒安全和執行緒不安全執行緒
- 執行緒池中多餘的執行緒是如何回收的?執行緒