成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

和杠精 聊Redis多線程 :(

數(shù)據(jù)庫 其他數(shù)據(jù)庫 Redis
周末被一位小同學憋的很窩火。他要和我探討一下,redis到底是多線程的還是單線程的。這個問題本來比較好解釋,但我遇到的卻是一個杠精。

 周末被一位小同學憋的很窩火。他要和我探討一下,redis到底是多線程的還是單線程的。這個問題本來比較好解釋,但我遇到的卻是一個杠精。

答案是顯而易見的:redis6,逃不過真香定理,引入了多線程;而在redis6之前,卻是單線程的。

也就是說,這不是一個是和否的問題,還涉及到第二維度的版本參與。

可是,這位同學要打我的臉。不知道小姐姐的臉皮很嫩么?摸不得。

“照你的邏輯,redis5是單線程的了?”

“是的。”

“那下面這張截圖是怎么回事?”

同學甩給我一張圖,并送來一個鄙視的眼神。

“使用top -Hp 查看。redis5有4個線程。該怎么解釋?”

這個問題,我也不知道怎么跟他解釋。使用top命令去觀測,redis5肯定是多線程的,比如bgsave,aof等,肯定要開啟一個線程去操作,否則早就炸了。

按照這個邏輯去說,redis就從來沒有單進程過。看著這張圖,我陷入了無盡的憂愁。

“Redis是否是單進程,主要是針對Redis的讀寫操作來說的”。但這句話對于杠精并沒有什么信服力。

“寫程序要嚴謹,你們這些人都太不嚴謹了。多線程就是多線程,你應(yīng)該問'redis的讀寫操作到底是不是多線程的'”。

我問你個大頭鬼。我并不想再和他交流,因為我為自己的博學感到無地自容。

但他接下來的一個問題,卻讓我陷入了真正的沉思。

1. redis的多線程有多快?

redis的多線程到底有什么性能提升呢?

官方的說法是:possible to easily speedup two times。可能會比較容易的提升到兩倍速度。

我英文不太好,對這種英文的修飾感到很迷惑。既然easily了,為什么還有possible。two times,到底是提升了2倍,還是提升到2倍。

官方說,到底能夠提升多少,還要看硬件的能力。

官方推薦,只有你的CPU核數(shù),達到4個的時候,才有必要試一試這個多線程的Feature。

不要用土豪的眼睛盯著我,這種4core的配置,已經(jīng)打死了大多數(shù)公司了。所以Redis貼心的把多線程功能是關(guān)閉的。(好像有點語病)

我只能求助那些在一線的前同事們。他們有沒有在生產(chǎn)環(huán)境,用上這劃時代的多線程Redis6x呢?

結(jié)果很令我滿意,沒有!

其中有一個回復(fù)我特別滿意。他說:“你竟然在問一個停留在JDK1.6的我,跑著Windows版本Redis的我,是否用到了Redis6。我還在用著Redis3呢。”

另外一個回復(fù)我感到更滿意,他說:“滾!”

2. 怎么用?

新技術(shù)肯定是要吹捧一下的,否則沒人實踐踩坑,作為追隨者就只能吃翔。

多線程在理論上,肯定是會有性能提升的。一個爸爸賺錢和2個爸爸賺錢,效果自然不一樣,只是苦了媽媽了。

Redis6的多線程開啟,需要配置一個參數(shù)。 

  1. io-threads 4 

當開啟之后,只有出流量使用多線程,如果你想要入流量也走多線程,那也可以配置以下參數(shù)。 

  1. io-threads-do-reads yes 

就這么兩個參數(shù),可以看到現(xiàn)在的redis多線程,還是稍顯寒磣了一些。

我們把它開啟之后,仍然使用top -Hp 查看相關(guān)進程,可以看到多了3個io_thd進程。

這部分邏輯,是在networking.c種實現(xiàn)的。這個文件已經(jīng)達到了3k多行,也是夠龐大的了。

3. Redis為什么又搞多線程了

使用redis-benchmark測試,單機單核的吞吐量,能夠達到10w+。

1秒是1000000000納秒,單次內(nèi)存操作大約是100納秒左右,那內(nèi)存操作可以達到1000w/s的速度。那Redis的瓶頸在哪里呢?

使用perf進行追蹤,可以發(fā)現(xiàn)它的耗時,主要是體現(xiàn)在sys_write系統(tǒng)調(diào)用上,也就是向socket寫數(shù)據(jù)。

既然瓶頸找到了,那就把它優(yōu)化掉。redis選擇的方式是使用多線程。

我使用benchmark測試了一下,4core的機器,CPU跑滿的時候,QPS達到了16w,并沒有翻倍(相對于單核的9w/s)。 

  1. benchmark 6379 clients 32  
  2. 164519.20 requests per second  
  3. 165411.09 requests per second 

用這么強的硬件,獲得這樣有限的性能提升,差強人意。

這就不難解釋為什么現(xiàn)在實踐的人那么少。出了因為新,還是不夠吸引人。

畢竟,4core的機器,我部署上3臺redis cluster的實例,理論上會提升三倍呢。

redis配置文件里,有不少內(nèi)容在注釋這個新特性。

4. 怎么實現(xiàn)?

如圖,一次redis請求,要建立連接,然后獲取操作的命令,然后執(zhí)行命令,最后將響應(yīng)的結(jié)果寫到socket上。

在redis的多線程模式下,獲取、解析命令,以及輸出結(jié)果著兩個過程,可以配置成多線程執(zhí)行的,因為它畢竟是我們定位到的主要耗時點。

但命令的執(zhí)行,也就是內(nèi)存操作,依然是單線程運行的。

這種設(shè)計造成了一個特性。

redis現(xiàn)在依然沒有多線程的鎖競爭和線程安全問題,因為它的數(shù)據(jù)讀取這一步驟,仍然是單線程的,要排隊運行。一些耗時的操作,比如keys *,hgetall等,仍然要注意。

redis并不是傳統(tǒng)的reactor模型,說實話很多東西硬套概念的話肯定只能鉆進個頭去漏出個尾巴。它也并不是master,worker這種干干凈凈的類似于memcached的模型,因為它把命令執(zhí)行操作給抽取出來了。其中緣由,看上面這張圖就夠了。

End

那么,下一個吸引杠精的問題難題來了:在這種多線程應(yīng)用場景下,redis算是I/O密集型,還是計算密集型呢?

或許,如果redis多線程中,無處不在的輪詢,屬于“計算”的話,它算是一個計算密集型應(yīng)用吧。 

 

責任編輯:龐桂玉 來源: 數(shù)據(jù)庫開發(fā)
相關(guān)推薦

2020-11-17 06:08:40

Redis多線程

2022-05-18 16:35:43

Redis內(nèi)存運維

2021-04-12 08:56:00

多線程Future模式

2024-09-13 17:13:56

Redis 6NoSQL多線程

2009-03-12 10:52:43

Java線程多線程

2022-07-29 08:58:44

多線程并發(fā)

2022-03-08 16:10:38

Redis事務(wù)機制

2020-12-01 10:32:42

Redis主從復(fù)制

2024-04-23 09:35:27

線程終止C#多線程編程

2023-06-13 13:39:00

多線程異步編程

2022-05-12 23:19:15

Redis內(nèi)存碎片處理

2023-03-06 21:23:23

Redis數(shù)據(jù)庫

2021-11-25 06:54:54

NginxHTTP服務(wù)器

2021-04-26 06:54:15

Redis多線程單線程

2021-08-11 09:37:11

Redis持久化磁盤

2020-10-07 22:21:13

程序員技術(shù)線程

2013-06-13 13:19:38

多線程

2023-09-26 12:16:29

JDK 21Java

2023-06-02 07:45:39

2021-09-11 15:26:23

Java多線程線程池
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 国产精品一卡二卡三卡 | 久久一级免费视频 | 精品国产一区二区三区免费 | 国产精品自产拍在线观看蜜 | 亚洲一区视频在线 | 精品一二区 | 国产福利小视频 | 欧美成人一区二免费视频软件 | 欧美日韩在线一区二区三区 | 免费在线播放黄色 | 欧美日韩看片 | 国产视频线观看永久免费 | 成人一区二区三区视频 | 亚洲成人国产 | 一区二区高清在线观看 | 久久久国产一区二区三区 | 国产精品视频区 | 成人超碰 | 欧美国产一区二区 | 老司机深夜福利网站 | 欧美一区二区在线 | 国产久| 日韩电影免费在线观看中文字幕 | 日韩在线不卡 | 三级黄色片在线 | 午夜理伦三级理论三级在线观看 | 国产免费一区二区 | 欧美在线a| 久久精品免费观看 | 国产精品久久久久久久一区二区 | 亚洲欧美在线一区 | 精品久久电影 | 久久av一区 | 天天艹天天干天天 | 亚洲 欧美 日韩 精品 | 欧美成人激情 | 91精品一区 | 国产伦精品一区二区三区在线 | 欧美精品久久久久 | 国产最新视频在线 | 国产观看 |