這篇文章主要介紹redis是單線程分析,文中介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們一定要看完!
十多年的梧州網(wǎng)站建設(shè)經(jīng)驗(yàn),針對設(shè)計、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時及時工作處理。營銷型網(wǎng)站建設(shè)的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動調(diào)整梧州建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計,從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)建站從事“梧州網(wǎng)站設(shè)計”,“梧州網(wǎng)站推廣”以來,每個客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。
以前一直有個誤區(qū),以為:高性能服務(wù)器 一定是 多線程來實(shí)現(xiàn)的
原因很簡單因?yàn)檎`區(qū)二導(dǎo)致的: 多線程 一定比 單線程 效率高。其實(shí)不然。
在說這個事前希望大家都能對 CPU 、 內(nèi)存 、 硬盤的速度都有了解了,這樣可能理解得更深刻一點(diǎn),不了解的朋友點(diǎn):CPU到底比內(nèi)存跟硬盤快多少
redis 核心就是 如果我的數(shù)據(jù)全都在內(nèi)存里,我單線程的去操作 就是效率最高的,為什么呢,因?yàn)槎嗑€程的本質(zhì)就是 CPU 模擬出來多個線程的情況,這種模擬出來的情況就有一個代價,就是上下文的切換,對于一個內(nèi)存的系統(tǒng)來說,它沒有上下文的切換就是效率最高的。
redis用單個CPU 綁定一塊內(nèi)存的數(shù)據(jù),然后針對這塊內(nèi)存的數(shù)據(jù)進(jìn)行多次讀寫的時候,都是在一個CPU上完成的,所以它是單線程處理這個事。在內(nèi)存的情況下,這個方案就是最佳方案。(推薦:《redis視頻教程》)
因?yàn)橐淮蜟PU上下文的切換大概在 1500ns 左右。
從內(nèi)存中讀取 1MB 的連續(xù)數(shù)據(jù),耗時大約為 250us,假設(shè)1MB的數(shù)據(jù)由多個線程讀取了1000次,那么就有1000次時間上下文的切換,
那么就有1500ns * 1000 = 1500us ,我單線程的讀完1MB數(shù)據(jù)才250us ,你光時間上下文的切換就用了1500us了,我還不算你每次讀一點(diǎn)數(shù)據(jù) 的時間,
那什么時候用多線程的方案呢?
答案是:下層的存儲等慢速的情況。比如磁盤
內(nèi)存是一個 IOPS 非常高的系統(tǒng),因?yàn)槲蚁肷暾堃粔K內(nèi)存就申請一塊內(nèi)存,銷毀一塊內(nèi)存我就銷毀一塊內(nèi)存,內(nèi)存的申請和銷毀是很容易的。而且內(nèi)存是可以動態(tài)的申請大小的。
磁盤的特性是:IPOS很低很低,但吞吐量很高。這就意味著,大量的讀寫操作都必須攢到一起,再提交到磁盤的時候,性能最高。為什么呢?
如果我有一個事務(wù)組的操作(就是幾個已經(jīng)分開了的事務(wù)請求,比如寫讀寫讀寫,這么五個操作在一起),在內(nèi)存中,因?yàn)镮OPS非常高,我可以一個一個的完成,但是如果在磁盤中也有這種請求方式的話,
我第一個寫操作是這樣完成的:我先在硬盤中尋址,大概花費(fèi)10ms,然后我讀一個數(shù)據(jù)可能花費(fèi)1ms然后我再運(yùn)算(忽略不計),再寫回硬盤又是10ms ,總共21ms
第二個操作去讀花了10ms, 第三個又是寫花費(fèi)了21ms ,然后我再讀10ms, 寫21ms ,五個請求總共花費(fèi)83ms,這還是最理想的情況下,這如果在內(nèi)存中,大概1ms不到。
所以對于磁盤來說,它吞吐量這么大,那最好的方案肯定是我將N個請求一起放在一個buff里,然后一起去提交。
方法就是用異步:將請求和處理的線程不綁定,請求的線程將請求放在一個buff里,然后等buff快滿了,處理的線程再去處理這個buff。然后由這個buff 統(tǒng)一的去寫入磁盤,或者讀磁盤,這樣效率就是最高。 java里的 IO不就是這么干的么~
對于慢速設(shè)備,這種處理方式就是最佳的,慢速設(shè)備有磁盤,網(wǎng)絡(luò) ,SSD 等等,
多線程 ,異步的方式處理這些問題非常常見,大名鼎鼎的netty 就是這么干的。
終于把 redis 為什么是單線程說清楚了,把什么時候用單線程跟多線程也說清楚了,其實(shí)也是些很簡單的東西,只是基礎(chǔ)不好的時候,就真的尷尬。。。。
補(bǔ)一發(fā)大師語錄:來說說,為何單核cpu綁定一塊內(nèi)存效率最高
“我們不能任由操作系統(tǒng)負(fù)載均衡,因?yàn)槲覀冏约焊私庾约旱某绦?,所以我們可以手動地為其分配CPU核,而不會過多地占用CPU”,默認(rèn)情況下單線程在進(jìn)行系統(tǒng)調(diào)用的時候會隨機(jī)使用CPU內(nèi)核,為了優(yōu)化Redis,我們可以使用工具為單線程綁定固定的CPU內(nèi)核,減少不必要的性能損耗!
redis作為單進(jìn)程模型的程序,為了充分利用多核CPU,常常在一臺server上會啟動多個實(shí)例。而為了減少切換的開銷,有必要為每個實(shí)例指定其所運(yùn)行的CPU。
Linux 上 taskset 可以將某個進(jìn)程綁定到一個特定的CPU。你比操作系統(tǒng)更了解自己的程序,為了避免調(diào)度器愚蠢的調(diào)度你的程序,或是為了在多線程程序中避免緩存失效造成的開銷。
以上是redis是單線程分析的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
名稱欄目:redis是單線程分析
本文鏈接:http://www.rwnh.cn/article36/psghpg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供用戶體驗(yàn)、搜索引擎優(yōu)化、虛擬主機(jī)、App開發(fā)、商城網(wǎng)站、
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)