redis 為什麼是單執行緒的?

時間 2021-06-08 13:57:14

1樓:詩和遠方

說Redis是單執行緒是不準確的,其實是多程序,多執行緒的,但如果說其I/O模型是單執行緒那就是對的。

接下來我們說說為什麼I/O模型要單執行緒。

我們用快取的目的無非就是做併發控制,快取資料,對效能都有一定的要求(注意這裡是指吞吐量和響應時間)。

最原始的方式就是單程序阻塞式I/O,這樣我們一次只能處理乙個請求,吞吐量低。

於是我們就有了多程序阻塞式I/O,這樣我們能夠一次處理多個請求,吞吐量提公升。

但是我們覺得還不夠,子程序的建立開銷太大,於是我們就有了單程序,多執行緒的方式,執行緒建立的開銷相對較小,吞吐量再次提公升。

但漸漸的我們發現還是有問題,執行緒建立還是有開銷,而且記憶體容量有限,不能無限建立,而且執行緒太多,管理開銷也大。於是我們又有了執行緒池,不重複建立執行緒,而且控制數量,效能再提公升。

雖然我們有了多執行緒,不過對於每個連線,雖然是建立了,但是還不可讀因為資料還沒有傳輸過來,這個時候讓執行緒被掛起,將會導致我們能夠繼續處理新來請求的執行緒數量減少(執行緒池),對吞吐量來說並不好。為了解決這個問題,我們單獨出來乙個執行緒負責接收和分發可讀連線,依賴底層系統呼叫,比如epoll, kqueue, evport等,來實現多路I/O復用。吞吐量又提公升了。

我們又想,這是不是就沒有提公升空間了呢?其實還有。在連線可讀之後,其實處理請求的過程中還會有I/O操作,還有返回響應,這都會讓我們的執行緒掛起,而我們的執行緒數量又有限,如果他們不閒置的話,我們可能能處理更多請求。

經過總結,發現大部分Web應用都是I/O密集型,CPU從來都不是瓶頸,於是乾脆就單執行緒多路I/O復用。不錯,又提公升了吞吐量。

目前業界到這裡就達止了,還有沒有更好?

我們的伺服器通常是多核的,而單執行緒只會負載CPU的乙個核心,而理論上的吞吐量極限就是當CPU單核負載達到100%的時候。如果想要再提高效能,那麼就可以多執行緒,每個執行緒都是多路I/O復用。那麼吞吐量可以再上乙個台階。

2樓:九零後老漢

redis 的涉及理念就是夠用就好

單執行緒可以避免多執行緒中的上下文切換的系統呼叫開銷,天然支援原子操作

資料操作基於記憶體, 不會有太多的阻塞,單執行緒單例項完全可以適應幾萬的併發

既然python直譯器是單執行緒的,還有進行多執行緒程式設計的必要嗎?

如果你的任務是多執行緒的,那麼必須多執行緒 例如網路通訊,你一邊把自己的話輸進去,一邊收聽別人傳給你的話那麼至少用兩個執行緒 至於以最快速度來計算的任務,多執行緒沒意義 多程序才有意義,可以利用CPU的多核來搞分布式計算,如乙個任務切成4個任務,就在4核同時跑 Coldwings 多執行緒可以用來幹...

多執行緒效能比單執行緒效能差的例子

有人在唱歌 Any kind of sequential program is not a good candidate to be threaded.An example of this is a program that calculates an individual tax return.A...

什麼是執行緒(程序)通訊,為什麼需要通訊?

check 777 程序通訊就是為了完成程序互斥和程序同步而存在的,假如有程序A和程序B。程序A想進入臨界區,程序B也想進入臨界區,這兩個程序得協商一下吧。而這個協商由OS負責還是全部由程序負責需要看程序通訊的方式。 圍城 因為有些複雜程式或者是系統需要多個程序或者執行緒共同完成某個具體的任務,那麼...