redis为什么选择单线程工作模型
1、先說一下為什么出現(xiàn)進(jìn)程,線程
進(jìn)程:在計(jì)算機(jī)發(fā)明之初就發(fā)現(xiàn),在輸入數(shù)據(jù)時(shí)(I/O速度慢),CPU是空閑的,這樣就浪費(fèi)了CPU資源,為了充分利用CPU資源,發(fā)明了進(jìn)程,在輸入程序A的數(shù)據(jù)時(shí),程序B在占用CPU資源進(jìn)行計(jì)算。
線程:為了減少進(jìn)程的上下文切換的損耗,滿足人機(jī)交互的實(shí)時(shí)性,同時(shí)保留進(jìn)程充分利用CPU資源的優(yōu)點(diǎn),出現(xiàn)了線程。
2,redis為什么不用多線程(不劃算唄)
(1)純內(nèi)存操作;
(2)多線程仍然會(huì)有上下文切換的損耗,雖然比進(jìn)程切換損耗小;
(3)采用了非阻塞I/O多路復(fù)用機(jī)制
題外話:我們現(xiàn)在要仔細(xì)的說一說I/O多路復(fù)用機(jī)制,因?yàn)檫@個(gè)說法實(shí)在是太通俗了,通俗到一般人都不懂是什么意思。博主打一個(gè)比方:小曲在S城開了一家快遞店,負(fù)責(zé)同城快送服務(wù)。小曲因?yàn)橘Y金限制,雇傭了一批快遞員,然后小曲發(fā)現(xiàn)資金不夠了,只夠買一輛車送快遞。
經(jīng)營方式一
客戶每送來一份快遞,小曲就讓一個(gè)快遞員盯著,然后快遞員開車去送快遞。慢慢的小曲就發(fā)現(xiàn)了這種經(jīng)營方式存在下述問題
- 幾十個(gè)快遞員基本上時(shí)間都花在了搶車上了,大部分快遞員都處在閑置狀態(tài),誰搶到了車,誰就能去送快遞
- 隨著快遞的增多,快遞員也越來越多,小曲發(fā)現(xiàn)快遞店里越來越擠,沒辦法雇傭新的快遞員了
- 快遞員之間的協(xié)調(diào)很花時(shí)間
綜合上述缺點(diǎn),小曲痛定思痛,提出了下面的經(jīng)營方式
經(jīng)營方式二
小曲只雇傭一個(gè)快遞員。然后呢,客戶送來的快遞,小曲按送達(dá)地點(diǎn)標(biāo)注好,然后依次放在一個(gè)地方。最后,那個(gè)快遞員依次的去取快遞,一次拿一個(gè),然后開著車去送快遞,送好了就回來拿下一個(gè)快遞。
對比
上述兩種經(jīng)營方式對比,是不是明顯覺得第二種,效率更高,更好呢。在上述比喻中:
- 每個(gè)快遞員------------------>每個(gè)線程
- 每個(gè)快遞-------------------->每個(gè)socket(I/O流)
- 快遞的送達(dá)地點(diǎn)-------------->socket的不同狀態(tài)
- 客戶送快遞請求-------------->來自客戶端的請求
- 小曲的經(jīng)營方式-------------->服務(wù)端運(yùn)行的代碼
- 一輛車---------------------->CPU的核數(shù)
于是我們有如下結(jié)論
1、經(jīng)營方式一就是傳統(tǒng)的并發(fā)模型,每個(gè)I/O流(快遞)都有一個(gè)新的線程(快遞員)管理。
2、經(jīng)營方式二就是I/O多路復(fù)用。只有單個(gè)線程(一個(gè)快遞員),通過跟蹤每個(gè)I/O流的狀態(tài)(每個(gè)快遞的送達(dá)地點(diǎn)),來管理多個(gè)I/O流。
下面類比到真實(shí)的redis線程模型,如圖所示
?
?
參照上圖,簡單來說,就是。我們的redis-client在操作的時(shí)候,會(huì)產(chǎn)生具有不同事件類型的socket。在服務(wù)端,有一段I/0多路復(fù)用程序,將其置入隊(duì)列之中。然后,文件事件分派器,依次去隊(duì)列中取,轉(zhuǎn)發(fā)到不同的事件處理器中。
需要說明的是,這個(gè)I/O多路復(fù)用機(jī)制,redis還提供了select、epoll、evport、kqueue等多路復(fù)用函數(shù)庫,大家可以自行去了解。
?
這通俗易懂的例子來自:https://www.cnblogs.com/rjzheng/p/9096228.html
推薦相關(guān)閱讀:http://www.cnblogs.com/huxiao-tee/p/4657851.html
?
轉(zhuǎn)載于:https://www.cnblogs.com/xdyixia/p/9110116.html
總結(jié)
以上是生活随笔為你收集整理的redis为什么选择单线程工作模型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: Java项目打包成exe的详细教程
- 下一篇: jquery 快速入门二
