為什么需要多線程
首先,現(xiàn)在的CPU一般都是由多個(gè)核心組成,每個(gè)核心可以認(rèn)為是一個(gè)獨(dú)立的處理器,它們能夠并行地處理任務(wù)。所以,如果我們的CPU是多核的,但是程序是單線程的,那么執(zhí)行程序時(shí),這個(gè)線程在某一個(gè)時(shí)刻只能在一個(gè)核心上運(yùn)行,而其它的核心卻是空閑的(如果沒(méi)有其他程序的話)。所以,為了提高CPU的使用率,我們可以創(chuàng)建多個(gè)線程,每個(gè)線程處理任務(wù)的一部分(每個(gè)部分互不依賴),而每個(gè)核心執(zhí)行一個(gè)線程,此時(shí)CPU的使用率將提高,程序的運(yùn)行速度自然也就加快了。
除此之外,假設(shè)我們的程序有A、B、C三個(gè)任務(wù)需要執(zhí)行,但是由于我們的程序使用的是單線程,這些任務(wù)只能輪流執(zhí)行,A執(zhí)行完畢只后,才能執(zhí)行B,B執(zhí)行完畢只后,才能執(zhí)行C。這也就意味著,在單線程的環(huán)境下,一個(gè)新的任務(wù),需要等待它之前的任務(wù)執(zhí)行完畢之后,才能被執(zhí)行。假設(shè)A任務(wù)是一個(gè)非常耗時(shí)的任務(wù),那么后面的B、C需要等待較長(zhǎng)的一段時(shí)間,才能被執(zhí)行,這樣的話提交B、C任務(wù)的用戶,需要等待較長(zhǎng)的時(shí)間,才能得到響應(yīng)。如果使用的是多線程,那么每個(gè)線程被分配到不同的核心上,可以并行地執(zhí)行;若核心數(shù)量不夠,CPU將采用時(shí)間片輪轉(zhuǎn)算法,輪流為每一個(gè)線程分配時(shí)間片執(zhí)行,這樣后續(xù)到達(dá)的任務(wù),也可以并發(fā)地執(zhí)行,而不需要等待之前任務(wù)的完成。此時(shí),后續(xù)到達(dá)的任務(wù),也可以較早地得到響應(yīng),任務(wù)的響應(yīng)速度變得更加均勻。
如何理解redis的單線程
這里需要注意一個(gè)問(wèn)題,我們所說(shuō)的Redis的單線程,不是指Redis程序真的只會(huì)有一個(gè)線程。這里所說(shuō)的單線程,指的是Redis處理客戶端發(fā)來(lái)的數(shù)據(jù)操作請(qǐng)求(增刪改查),只會(huì)使用一個(gè)線程去執(zhí)行
。但是實(shí)際上,Redis在執(zhí)行其他操作的時(shí)候,可能會(huì)開(kāi)啟多個(gè)進(jìn)程或線程,比如說(shuō)持久化。Redis執(zhí)行BGSAVE指令,進(jìn)行快照持久化時(shí),就會(huì)fork出一個(gè)子進(jìn)程,然后子進(jìn)程去創(chuàng)建快照,完成持久化操作。
redis為什么使用單線程
官方解釋如下:因?yàn)镽edis是基于內(nèi)存的操作,CPU不是Redis的瓶頸,Redis的瓶頸最有可能是機(jī)器內(nèi)存的大小或者網(wǎng)絡(luò)帶寬。既然單線程容易實(shí)現(xiàn),而且CPU不會(huì)成為瓶頸,那就順理成章地采用單線程的方案了
。
上面的解釋不是很好理解,我就簡(jiǎn)單說(shuō)一說(shuō)我自己的理解吧。我們知道,Redis將數(shù)據(jù)存放在內(nèi)存當(dāng)中,這也就意味著,Redis在操作數(shù)據(jù)時(shí),不需要進(jìn)行磁盤I/O。磁盤I/O是一個(gè)比較耗時(shí)的操作,所以對(duì)于需要進(jìn)行磁盤I/O的程序,我們可以使用多線程,在某個(gè)線程進(jìn)行I/O時(shí),CPU切換到當(dāng)前程序的其他線程執(zhí)行,以此減少CPU的等待時(shí)間。而Redis直接操作內(nèi)存中的數(shù)據(jù),所以使用多線程并不能有效提升效率,相反,使用多線程反倒會(huì)因?yàn)樾枰M(jìn)行線程的切換而降低效率。
除此之外,使用多線程的話,多個(gè)線程間進(jìn)行同步,保證線程的安全,也是需要開(kāi)銷的。尤其是Redis的數(shù)據(jù)結(jié)構(gòu)都是一些實(shí)現(xiàn)較為簡(jiǎn)單的集合結(jié)構(gòu),若使用多線程,將會(huì)頻繁地發(fā)生線程沖突,線程的競(jìng)爭(zhēng)頻率較高,反倒會(huì)拖慢Redis的響應(yīng)速度。
綜上所述,Redis為了保持簡(jiǎn)單和高效,自然而然地就使用了單線程。
redis如何提高CPU的使用率
前面也提過(guò),現(xiàn)在的CPU一般都有多個(gè)核心,每個(gè)核心可以單獨(dú)執(zhí)行。Redis處理客戶端請(qǐng)求使用單線程,那么自然而然,無(wú)法將CPU的所有核心都占用,也就造成了資源的浪費(fèi)。而解決的方式也比較簡(jiǎn)單,我們可以在同一個(gè)服務(wù)器上開(kāi)啟多個(gè)Redis程序,每個(gè)Redis程序使用不同的端口,相互獨(dú)立,以此提高CPU的使用率。而這多個(gè)Redis程序可以配置成主從節(jié)點(diǎn),共同為一個(gè)程序服務(wù),也可以相互獨(dú)立,服務(wù)于多個(gè)程序。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-514937.html
總結(jié)
以上就對(duì)Redis為何使用單線程,做了一個(gè)大致的介紹,總的來(lái)說(shuō),Redis使用單線程的原因就是:**多線程并不能有效提升Redis的性能,相反可能還會(huì)降低性能,所以自然而然使用單線程。**希望這篇博客對(duì)有需要的人有所幫助 ,若存在錯(cuò)誤或者不足,歡迎指正和補(bǔ)充。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-514937.html
到了這里,關(guān)于Redis為什么是單線程的的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!