Redis 究竟是單線程仍是多線程?我要吊打面試官!

最近在Java技術棧公衆號發佈的一篇文章,其中有一道題:java

Redis是多線程仍是單線程?(回答單線程的請回吧,爲何請回,請往下看)程序員

好些粉絲在後臺問我:爲何請回,Redis不是單線程嗎?面試

你們注意審題:Redis是多線程仍是單線程?redis

這個問題你要從多個方面回答,若是你僅僅只回答 "單線程" 確定是說不過去的,爲何呢?後端

因此今天,棧長利用工做時間緊急把這個問題緊急梳理了下,但願對你們有幫助。性能優化

一、Redis 單線程到底指什麼?

沒錯,你們所熟知的 Redis 確實是單線程模型,指的是執行 Redis 命令的核心模塊是單線程的,而不是整個 Redis 實例就一個線程,Redis 其餘模塊還有各自模塊的線程的。微信

下面這個解釋比較好:網絡

Redis基於Reactor模式開發了網絡事件處理器,這個處理器被稱爲文件事件處理器。它的組成結構爲4部分:多個套接字、IO多路複用程序、文件事件分派器、事件處理器。
由於文件事件分派器隊列的消費是單線程的,因此Redis才叫單線程模型。
參考:https://www.jianshu.com/p/6264fa82ac33數據結構

二、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 了,若是確實沒據說還好,若是據說了,還要和我槓精,我就無言以對了,對於新技術的發展和學習不就是咱們和麪試官的談資嗎?

三、爲何網絡處理要引入多線程?

以前的段落說了,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、後端、架構、阿里巴巴等大廠最新面試題

以爲不錯,別忘了點贊+轉發哦!

相關文章
相關標籤/搜索