Redis為什么使用單線程模型?-創(chuàng)新互聯(lián)

雙線程的程序可以支持每秒幾百萬的請(qǐng)求量,眾所周知,Redis 作為被廣泛使用的內(nèi)存數(shù)據(jù)庫(kù)偏偏選擇了單線程模型,這又是為什么呢?其實(shí)簡(jiǎn)單概括起來主要有以下三個(gè)原因,方便維護(hù),可以并發(fā)的處理任務(wù)以及雙線程不能解決Redis的性能瓶頸。下面我們來仔細(xì)分析一下Redis選擇單線程模型的原因。

目前創(chuàng)新互聯(lián)已為近千家的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)絡(luò)空間、網(wǎng)站改版維護(hù)、企業(yè)網(wǎng)站設(shè)計(jì)、改則網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。

Redis為什么使用單線程模型?

原因一:?jiǎn)尉€程模型更方便維護(hù)

相信我們都了解可維護(hù)性對(duì)一個(gè)項(xiàng)目的重要性,而Redis 使用單線程模型能帶來更好的可維護(hù)性,方便開發(fā)和調(diào)試。如果代碼難以調(diào)試和測(cè)試,問題也經(jīng)常難以復(fù)現(xiàn),這對(duì)于任何一個(gè)項(xiàng)目來說都會(huì)嚴(yán)重地影響項(xiàng)目的可維護(hù)性。多線程模型雖然在某些方面表現(xiàn)優(yōu)異,但是它卻引入了程序執(zhí)行順序的不確定性,代碼的執(zhí)行過程不再是串行的,多個(gè)線程同時(shí)訪問的變量如果沒有謹(jǐn)慎處理就會(huì)帶來詭異的問題。而多線程帶來的問題是很明顯的,如果計(jì)算機(jī)中的兩個(gè)進(jìn)程(線程同理)同時(shí)嘗試修改一個(gè)共享內(nèi)存的內(nèi)容,在沒有并發(fā)控制的情況下,最終的結(jié)果依賴于兩個(gè)進(jìn)程的執(zhí)行順序和時(shí)機(jī),如果發(fā)生了并發(fā)訪問沖突,最后的結(jié)果就會(huì)是不正確的。

原因二:可以并發(fā)的處理任務(wù)。

雖然,Redis選擇了單線程模型,但是這也不影響它能并發(fā)的處理客戶端的請(qǐng)求。Redis 服務(wù)中運(yùn)行的絕大多數(shù)操作的性能瓶頸都不是 CPU。用單線程模型也并不意味著程序不能并發(fā)的處理任務(wù),Redis 雖然使用單線程模型處理用戶的請(qǐng)求,但是它卻使用 I/O 多路復(fù)用機(jī)制并發(fā)處理來自客戶端的多個(gè)連接,同時(shí)等待多個(gè)連接發(fā)送的請(qǐng)求。在 I/O 多路復(fù)用模型中,最重要的函數(shù)調(diào)用就是 select 以及類似函數(shù),該方法的能夠同時(shí)監(jiān)控多個(gè)文件描述符(也就是客戶端的連接)的可讀可寫情況,當(dāng)其中的某些文件描述符可讀或者可寫時(shí),select 方法就會(huì)返回可讀以及可寫的文件描述符個(gè)數(shù)。使用 I/O 多路復(fù)用技術(shù)能夠極大地減少系統(tǒng)的開銷,系統(tǒng)不再需要額外創(chuàng)建和維護(hù)進(jìn)程和線程來監(jiān)聽來自客戶端的大量連接,減少了服務(wù)器的開發(fā)成本和維護(hù)成本

原因三:雙線程不能解決Redis的性能瓶頸

這也是Redis選擇單線程模型的最核心的原因。雖然多線程技術(shù)的能夠幫助我們充分利用 CPU 的計(jì)算資源來并發(fā)的執(zhí)行不同的任務(wù),但是 CPU 資源往往都不是 Redis 服務(wù)器的性能瓶頸。哪怕我們?cè)谝粋€(gè)普通的 Linux 服務(wù)器上啟動(dòng) Redis 服務(wù),它也能在 1s 的時(shí)間內(nèi)處理 1,000,000 個(gè)用戶請(qǐng)求。

如果這種吞吐量不能滿足我們的需求,更推薦的做法是使用分片的方式將不同的請(qǐng)求交給不同的 Redis 服務(wù)器來處理,而不是在同一個(gè) Redis 服務(wù)中引入大量的多線程操作。所以Redis 并不是 CPU 密集型的服務(wù),如果不開啟 AOF 備份,所有 Redis 的操作都會(huì)在內(nèi)存中完成不會(huì)涉及任何的 I/O 操作,這些數(shù)據(jù)的讀寫由于只發(fā)生在內(nèi)存中,所以處理速度是非常快的;整個(gè)服務(wù)的瓶頸在于網(wǎng)絡(luò)傳輸帶來的延遲和等待客戶端的數(shù)據(jù)傳輸,也就是網(wǎng)絡(luò) I/O,所以使用多線程模型處理全部的外部請(qǐng)求可能不是一個(gè)好的方案。

Redis選擇單線程模型的原因分析就講到這里了,綜上所述,Redis選擇單線程模型的好處更多,使用雙線程其實(shí)是完全沒有必要的。當(dāng)然,以上的分析可能已經(jīng)打破了大家對(duì)于單線程的固有印象,因此不是說雙線程就一定比單線程好,又結(jié)合具體的實(shí)際情況來分析。

當(dāng)前文章:Redis為什么使用單線程模型?-創(chuàng)新互聯(lián)
網(wǎng)站網(wǎng)址:http://muchs.cn/article22/ddoicc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供響應(yīng)式網(wǎng)站自適應(yīng)網(wǎng)站、網(wǎng)站排名定制網(wǎng)站、網(wǎng)頁(yè)設(shè)計(jì)公司、手機(jī)網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化