最近在Java技術堆疊公眾號發布的一篇文章,其中有一道題:
Redis是多執行緒還是單執行緒?(回答單執行緒的請回吧,為什么請回,請往下看)
好些粉絲在后臺問我:為什么請回,Redis不是單執行緒嗎?
大家注意審題:Redis是多執行緒還是單執行緒?
這個問題你要從多個方面回答,如果你僅僅只回答 "單執行緒" 肯定是說不過去的,為什么呢?
所以今天,堆疊長利用作業時間緊急把這個問題緊急梳理了下,希望對大家有幫助,
1、Redis 單執行緒到底指什么?
沒錯,大家所熟知的 Redis 確實是單執行緒模型,指的是執行 Redis 命令的核心模塊是單執行緒的,而不是整個 Redis 實體就一個執行緒,Redis 其他模塊還有各自模塊的執行緒的,
下面這個解釋比較好:

Redis基于Reactor模式開發了網路事件處理器,這個處理器被稱為檔案事件處理器,它的組成結構為4部分:多個套接字、IO多路復用程式、檔案事件分派器、事件處理器,
因為檔案事件分派器佇列的消費是單執行緒的,所以Redis才叫單執行緒模型,
參考:https://www.jianshu.com/p/6264fa82ac33
2、Redis 不僅僅是單執行緒
一般來說 Redis 的瓶頸并不在 CPU,而在記憶體和網路,如果要使用 CPU 多核,可以搭建多個 Redis 實體來解決,
其實,Redis 4.0 開始就有多執行緒的概念了,比如 Redis 通過多執行緒方式在后臺洗掉物件、以及通過 Redis 模塊實作的阻塞命令等,
來源官方的解釋:

如果你能說到這里,對 Redis 單/多執行緒的理解也有你自己更多的認識了,
另外,前些天 Redis 6 正式發布了,其中有一個是被說了很久的多執行緒IO:

這個 Theaded IO 指的是在網路 IO 處理方面上了多執行緒,如網路資料的讀寫和協議決議等,需要注意的是,執行命令的核心模塊還是單執行緒的,
所以,你要是再把 Redis 6.0 網路處理多執行緒這塊回答上了,你也不至于 "請回" 了,
之前有的人在后臺和我杠精說:Redis 6 不是還沒發布嗎?
Redis 6 Beta 版本多執行緒這個說了多久了,作為一個程式員,如果這個還不能 get 到的話,那就有點 OUT 了,如果確實沒聽說還好,如果聽說了,還要和我杠精,我就無言以對了,對于新技術的發展和學習不就是我們和面試官的談資嗎?
3、為什么網路處理要引入多執行緒?
之前的段落說了,Redis 的瓶頸并不在 CPU,而在記憶體和網路,
記憶體不夠的話,可以加記憶體或者做資料結構優化和其他優化等,但網路的性能優化才是大頭,網路 IO 的讀寫在 Redis 整個執行期間占用了大部分的 CPU 時間,如果把網路處理這部分做成多執行緒處理方式,那對整個 Redis 的性能會有很大的提升,
網上也有對 Redis 單/多執行緒情況下的 get/set 操作性能做了對比:


參考:https://blog.csdn.net/weixin_45583158/article/details/100143587
從上面的性能測驗圖來看,多執行緒的性能幾乎是單執行緒的兩倍了,從該文章來看,這個只是簡單的針對多執行緒性能的驗證,并沒有做很多嚴謹的測驗,不能作為線上指標參考,
但可以知道的是,Redis 在網路處理方面上了多執行緒確實會讓 Redis 性能上一個新臺階,不過 Redis 6.0 剛發布,不可能有企業馬上上生產環境,可能還需要一段時間的優化和驗證,我們再期待吧,
最后,目前最新的 6.0 版本中,IO 多執行緒處理模式默認是不開啟的,需要去組態檔中開啟并配置執行緒數,有興趣的研究下吧,
總結
這篇文章只是對 Redis 單執行緒/多執行緒有個基本的認識和總結,吊打面試官可能還說不上,但是在面對面試官提問的時候,不要只是單純的說單執行緒,你要回答的還要比這個更多,
對于這個問題,你還有什么見解呢?歡迎留言分享哦~
最后,關注微信公眾號:Java技術堆疊,在后臺回復:吊打,可以看往期吊打面試官系列,持續更新哦,
推薦去我的博客閱讀更多:
1.Java JVM、集合、多執行緒、新特性系列教程
2.Spring MVC、Spring Boot、Spring Cloud 系列教程
3.Maven、Git、Eclipse、Intellij IDEA 系列工具教程
4.Java、后端、架構、阿里巴巴等大廠最新面試題
覺得不錯,別忘了點贊+轉發哦!
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/4600.html
標籤:NoSQL
