最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Redis是單線(xiàn)程的嗎

 更新時(shí)間:2023年06月30日 09:04:42   作者:杭州下小雨~  
Redis使用單線(xiàn)程的原因就是多線(xiàn)程并不能有效提升Redis的性能,相反可能還會(huì)降低性能,所以自然而然使用單線(xiàn)程,本文給大家詳細(xì)介紹了Redis為什么是單線(xiàn)程的,感興趣的朋友跟隨小編一起看看吧

Redis為什么是單線(xiàn)程的

為什么需要多線(xiàn)程

首先,現(xiàn)在的CPU一般都是由多個(gè)核心組成,每個(gè)核心可以認(rèn)為是一個(gè)獨(dú)立的處理器,它們能夠并行地處理任務(wù)。所以,如果我們的CPU是多核的,但是程序是單線(xiàn)程的,那么執(zhí)行程序時(shí),這個(gè)線(xiàn)程在某一個(gè)時(shí)刻只能在一個(gè)核心上運(yùn)行,而其它的核心卻是空閑的(如果沒(méi)有其他程序的話(huà))。所以,為了提高CPU的使用率,我們可以創(chuàng)建多個(gè)線(xiàn)程,每個(gè)線(xiàn)程處理任務(wù)的一部分(每個(gè)部分互不依賴(lài)),而每個(gè)核心執(zhí)行一個(gè)線(xiàn)程,此時(shí)CPU的使用率將提高,程序的運(yùn)行速度自然也就加快了。

除此之外,假設(shè)我們的程序有A、B、C三個(gè)任務(wù)需要執(zhí)行,但是由于我們的程序使用的是單線(xiàn)程,這些任務(wù)只能輪流執(zhí)行,A執(zhí)行完畢只后,才能執(zhí)行B,B執(zhí)行完畢只后,才能執(zhí)行C。這也就意味著,在單線(xiàn)程的環(huán)境下,一個(gè)新的任務(wù),需要等待它之前的任務(wù)執(zhí)行完畢之后,才能被執(zhí)行。假設(shè)A任務(wù)是一個(gè)非常耗時(shí)的任務(wù),那么后面的B、C需要等待較長(zhǎng)的一段時(shí)間,才能被執(zhí)行,這樣的話(huà)提交B、C任務(wù)的用戶(hù),需要等待較長(zhǎng)的時(shí)間,才能得到響應(yīng)。如果使用的是多線(xiàn)程,那么每個(gè)線(xiàn)程被分配到不同的核心上,可以并行地執(zhí)行;若核心數(shù)量不夠,CPU將采用時(shí)間片輪轉(zhuǎn)算法,輪流為每一個(gè)線(xiàn)程分配時(shí)間片執(zhí)行,這樣后續(xù)到達(dá)的任務(wù),也可以并發(fā)地執(zhí)行,而不需要等待之前任務(wù)的完成。此時(shí),后續(xù)到達(dá)的任務(wù),也可以較早地得到響應(yīng),任務(wù)的響應(yīng)速度變得更加均勻。

如何理解redis的單線(xiàn)程

這里需要注意一個(gè)問(wèn)題,我們所說(shuō)的Redis的單線(xiàn)程,不是指Redis程序真的只會(huì)有一個(gè)線(xiàn)程。這里所說(shuō)的單線(xiàn)程,指的是Redis處理客戶(hù)端發(fā)來(lái)的數(shù)據(jù)操作請(qǐng)求(增刪改查),只會(huì)使用一個(gè)線(xiàn)程去執(zhí)行。但是實(shí)際上,Redis在執(zhí)行其他操作的時(shí)候,可能會(huì)開(kāi)啟多個(gè)進(jìn)程或線(xiàn)程,比如說(shuō)持久化。Redis執(zhí)行BGSAVE指令,進(jìn)行快照持久化時(shí),就會(huì)fork出一個(gè)子進(jìn)程,然后子進(jìn)程去創(chuàng)建快照,完成持久化操作。

redis為什么使用單線(xiàn)程

官方解釋如下:因?yàn)镽edis是基于內(nèi)存的操作,CPU不是Redis的瓶頸,Redis的瓶頸最有可能是機(jī)器內(nèi)存的大小或者網(wǎng)絡(luò)帶寬。既然單線(xiàn)程容易實(shí)現(xiàn),而且CPU不會(huì)成為瓶頸,那就順理成章地采用單線(xiàn)程的方案了。

上面的解釋不是很好理解,我就簡(jiǎn)單說(shuō)一說(shuō)我自己的理解吧。我們知道,Redis將數(shù)據(jù)存放在內(nèi)存當(dāng)中,這也就意味著,Redis在操作數(shù)據(jù)時(shí),不需要進(jìn)行磁盤(pán)I/O。磁盤(pán)I/O是一個(gè)比較耗時(shí)的操作,所以對(duì)于需要進(jìn)行磁盤(pán)I/O的程序,我們可以使用多線(xiàn)程,在某個(gè)線(xiàn)程進(jìn)行I/O時(shí),CPU切換到當(dāng)前程序的其他線(xiàn)程執(zhí)行,以此減少CPU的等待時(shí)間。而Redis直接操作內(nèi)存中的數(shù)據(jù),所以使用多線(xiàn)程并不能有效提升效率,相反,使用多線(xiàn)程反倒會(huì)因?yàn)樾枰M(jìn)行線(xiàn)程的切換而降低效率。

除此之外,使用多線(xiàn)程的話(huà),多個(gè)線(xiàn)程間進(jìn)行同步,保證線(xiàn)程的安全,也是需要開(kāi)銷(xiāo)的。尤其是Redis的數(shù)據(jù)結(jié)構(gòu)都是一些實(shí)現(xiàn)較為簡(jiǎn)單的集合結(jié)構(gòu),若使用多線(xiàn)程,將會(huì)頻繁地發(fā)生線(xiàn)程沖突,線(xiàn)程的競(jìng)爭(zhēng)頻率較高,反倒會(huì)拖慢Redis的響應(yīng)速度。

綜上所述,Redis為了保持簡(jiǎn)單和高效,自然而然地就使用了單線(xiàn)程。

redis如何提高CPU的使用率

前面也提過(guò),現(xiàn)在的CPU一般都有多個(gè)核心,每個(gè)核心可以單獨(dú)執(zhí)行。Redis處理客戶(hù)端請(qǐng)求使用單線(xiàn)程,那么自然而然,無(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è)程序。

總結(jié)

以上就對(duì)Redis為何使用單線(xiàn)程,做了一個(gè)大致的介紹,總的來(lái)說(shuō),Redis使用單線(xiàn)程的原因就是:多線(xiàn)程并不能有效提升Redis的性能,相反可能還會(huì)降低性能,所以自然而然使用單線(xiàn)程。

Redis為什么是單線(xiàn)程、及高并發(fā)快的大原因詳解

Redis的高并發(fā)和快速原因

1.redis是基于內(nèi)存的,內(nèi)存的讀寫(xiě)速度非??欤?/p>

2.redis是單線(xiàn)程的,省去了很多上下文切換線(xiàn)程的時(shí)間;

3.redis使用多路復(fù)用技術(shù),可以處理并發(fā)的連接。非阻塞IO 內(nèi)部實(shí)現(xiàn)采用epoll,采用了epoll+自己實(shí)現(xiàn)的簡(jiǎn)單的事件框架。epoll中的讀、寫(xiě)、關(guān)閉、連接都轉(zhuǎn)化成了事件,然后利用epoll的多路復(fù)用特性,絕不在io上浪費(fèi)一點(diǎn)時(shí)間。

下面重點(diǎn)介紹單線(xiàn)程設(shè)計(jì)和IO多路復(fù)用核心設(shè)計(jì)快的原因。

為什么Redis是單線(xiàn)程的

1.官方答案

因?yàn)镽edis是基于內(nèi)存的操作,CPU不是Redis的瓶頸,Redis的瓶頸最有可能是機(jī)器內(nèi)存的大小或者網(wǎng)絡(luò)帶寬。既然單線(xiàn)程容易實(shí)現(xiàn),而且CPU不會(huì)成為瓶頸,那就順理成章地采用單線(xiàn)程的方案了。

2.性能指標(biāo)

關(guān)于redis的性能,官方網(wǎng)站也有,普通筆記本輕松處理每秒幾十萬(wàn)的請(qǐng)求。

3.詳細(xì)原因

1)不需要各種鎖的性能消耗

Redis的數(shù)據(jù)結(jié)構(gòu)并不全是簡(jiǎn)單的Key-Value,還有l(wèi)ist,hash等復(fù)雜的結(jié)構(gòu),這些結(jié)構(gòu)有可能會(huì)進(jìn)行很細(xì)粒度的操作,比如在很長(zhǎng)的列表后面添加一個(gè)元素,在hash當(dāng)中添加或者刪除

一個(gè)對(duì)象。這些操作可能就需要加非常多的鎖,導(dǎo)致的結(jié)果是同步開(kāi)銷(xiāo)大大增加。

總之,在單線(xiàn)程的情況下,就不用去考慮各種鎖的問(wèn)題,不存在加鎖釋放鎖操作,沒(méi)有因?yàn)榭赡艹霈F(xiàn)死鎖而導(dǎo)致的性能消耗。

2)單線(xiàn)程多進(jìn)程集群方案

單線(xiàn)程的威力實(shí)際上非常強(qiáng)大,每核心效率也非常高,多線(xiàn)程自然是可以比單線(xiàn)程有更高的性能上限,但是在今天的計(jì)算環(huán)境中,即使是單機(jī)多線(xiàn)程的上限也往往不能滿(mǎn)足需要了,需要進(jìn)一步摸索的是多服務(wù)器集群化的方案,這些方案中多線(xiàn)程的技術(shù)照樣是用不上的。

所以單線(xiàn)程、多進(jìn)程的集群不失為一個(gè)時(shí)髦的解決方案。

3)CPU消耗

采用單線(xiàn)程,避免了不必要的上下文切換和競(jìng)爭(zhēng)條件,也不存在多進(jìn)程或者多線(xiàn)程導(dǎo)致的切換而消耗 CPU。

但是如果CPU成為Redis瓶頸,或者不想讓服務(wù)器其他CUP核閑置,那怎么辦?

可以考慮多起幾個(gè)Redis進(jìn)程,Redis是key-value數(shù)據(jù)庫(kù),不是關(guān)系數(shù)據(jù)庫(kù),數(shù)據(jù)之間沒(méi)有約束。只要客戶(hù)端分清哪些key放在哪個(gè)Redis進(jìn)程上就可以了。

Redis單線(xiàn)程的優(yōu)劣勢(shì)

1.單進(jìn)程單線(xiàn)程優(yōu)勢(shì)

 代碼更清晰,處理邏輯更簡(jiǎn)單 不用去考慮各種鎖的問(wèn)題,不存在加鎖釋放鎖操作,沒(méi)有因?yàn)榭赡艹霈F(xiàn)死鎖而導(dǎo)致的性能消耗 不存在多進(jìn)程或者多線(xiàn)程導(dǎo)致的切換而消耗CPU

2.單進(jìn)程單線(xiàn)程弊端

 無(wú)法發(fā)揮多核CPU性能,不過(guò)可以通過(guò)在單機(jī)開(kāi)多個(gè)Redis實(shí)例來(lái)完善; IO多路復(fù)用技術(shù)

redis 采用網(wǎng)絡(luò)IO多路復(fù)用技術(shù)來(lái)保證在多連接的時(shí)候, 系統(tǒng)的高吞吐量。

多路-指的是多個(gè)socket連接,復(fù)用-指的是復(fù)用一個(gè)線(xiàn)程。多路復(fù)用主要有三種技術(shù):select,poll,epoll。epoll是最新的也是目前最好的多路復(fù)用技術(shù)。

這里“多路”指的是多個(gè)網(wǎng)絡(luò)連接,“復(fù)用”指的是復(fù)用同一個(gè)線(xiàn)程。采用多路I/O復(fù)用技術(shù)可以讓單個(gè)線(xiàn)程高效的處理多個(gè)連接請(qǐng)求(盡量減少網(wǎng)絡(luò)IO的時(shí)間消耗),且Redis在內(nèi)存中操作數(shù)據(jù)的速度非??欤▋?nèi)存內(nèi)的操作不會(huì)成為這里的性能瓶頸),主要以上兩點(diǎn)造就了Redis具有很高的吞吐量。

Redis高并發(fā)快總結(jié)

1. Redis是純內(nèi)存數(shù)據(jù)庫(kù),一般都是簡(jiǎn)單的存取操作,線(xiàn)程占用的時(shí)間很多,時(shí)間的花費(fèi)主要集中在IO上,所以讀取速度快。

2. 再說(shuō)一下IO,Redis使用的是非阻塞IO,IO多路復(fù)用,使用了單線(xiàn)程來(lái)輪詢(xún)描述符,將數(shù)據(jù)庫(kù)的開(kāi)、關(guān)、讀、寫(xiě)都轉(zhuǎn)換成了事件,減少了線(xiàn)程切換時(shí)上下文的切換和競(jìng)爭(zhēng)。

3. Redis采用了單線(xiàn)程的模型,保證了每個(gè)操作的原子性,也減少了線(xiàn)程的上下文切換和競(jìng)爭(zhēng)。

4. 另外,數(shù)據(jù)結(jié)構(gòu)也幫了不少忙,Redis全程使用hash結(jié)構(gòu),讀取速度快,還有一些特殊的數(shù)據(jù)結(jié)構(gòu),對(duì)數(shù)據(jù)存儲(chǔ)進(jìn)行了優(yōu)化,如壓縮表,對(duì)短數(shù)據(jù)進(jìn)行壓縮存儲(chǔ),再如,跳表,使用有序的數(shù)據(jù)結(jié)構(gòu)加快讀取的速度。

5. 還有一點(diǎn),Redis采用自己實(shí)現(xiàn)的事件分離器,效率比較高,內(nèi)部采用非阻塞的執(zhí)行方式,吞吐能力比較大。

到此這篇關(guān)于Redis為什么是單線(xiàn)程的的文章就介紹到這了,更多相關(guān)Redis單線(xiàn)程內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • redis的持久化和緩存機(jī)制解讀

    redis的持久化和緩存機(jī)制解讀

    這篇文章主要介紹了redis的持久化和緩存機(jī)制,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • Redis所實(shí)現(xiàn)的Reactor模型設(shè)計(jì)方案

    Redis所實(shí)現(xiàn)的Reactor模型設(shè)計(jì)方案

    這篇文章主要介紹了Redis所實(shí)現(xiàn)的Reactor模型,本文將帶領(lǐng)讀者從源碼的角度來(lái)查看redis關(guān)于reactor模型的設(shè)計(jì),需要的朋友可以參考下
    2024-06-06
  • Redis處理高并發(fā)之布隆過(guò)濾器詳解

    Redis處理高并發(fā)之布隆過(guò)濾器詳解

    這篇文章主要為大家介紹了Redis處理高并發(fā)之布隆過(guò)濾器詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • Redis初識(shí)、Redis的安裝與啟動(dòng)、Redis命令及Java客戶(hù)端詳解

    Redis初識(shí)、Redis的安裝與啟動(dòng)、Redis命令及Java客戶(hù)端詳解

    Redis作為當(dāng)前最流行的內(nèi)存數(shù)據(jù)庫(kù)之一,以其高性能、豐富的數(shù)據(jù)結(jié)構(gòu)和靈活的持久化機(jī)制,廣泛應(yīng)用于緩存、消息隊(duì)列、分布式鎖等場(chǎng)景,這篇文章主要介紹了Redis初識(shí)、Redis的安裝與啟動(dòng)、Redis命令及Java客戶(hù)端的相關(guān)資料,需要的朋友可以參考下
    2026-05-05
  • 一文弄懂Redis Stream消息隊(duì)列

    一文弄懂Redis Stream消息隊(duì)列

    本文主要介紹了一文弄懂Redis Stream消息隊(duì)列,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • redis緩存穿透解決方法

    redis緩存穿透解決方法

    在本篇文章里小編給大家分享了關(guān)于redis緩存穿透的解決方法以及相關(guān)實(shí)例內(nèi)容,需要的朋友們學(xué)習(xí)下。
    2019-06-06
  • redis清空所有數(shù)據(jù)的三種方法

    redis清空所有數(shù)據(jù)的三種方法

    本文主要介紹了redis清空所有數(shù)據(jù)的三種方法,主要包括FLUSHALL,FLUSHDB,SCREPT FLUSH這三個(gè)指令,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-09-09
  • redis擊穿現(xiàn)象如何防止

    redis擊穿現(xiàn)象如何防止

    本文主要介紹了redis擊穿現(xiàn)象如何防止,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • Redis性能大幅提升之Batch批量讀寫(xiě)詳解

    Redis性能大幅提升之Batch批量讀寫(xiě)詳解

    這篇文章主要給大家介紹了關(guān)于Redis性能大幅提升之Batch批量讀寫(xiě)的相關(guān)資料,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)跟著小編一起來(lái)學(xué)習(xí)學(xué)習(xí)吧。
    2017-06-06
  • redis在Windows中下載及安裝、設(shè)置教程

    redis在Windows中下載及安裝、設(shè)置教程

    這篇文章主要介紹了Windows中redis的下載及安裝、設(shè)置教程,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-12-12

最新評(píng)論

常山县| 三都| 武宣县| 贵南县| 高邮市| 临湘市| 怀远县| 土默特左旗| 镇江市| 昭平县| 伊吾县| 绵阳市| 威宁| 遂昌县| 卢龙县| 碌曲县| 盘锦市| 东明县| 都匀市| 襄汾县| 黔南| 华容县| 铜川市| 盘锦市| 梁河县| 镶黄旗| 兴业县| 兴隆县| 杭州市| 城步| 宝应县| 瑞昌市| 永城市| 开阳县| 门头沟区| 班玛县| 潮州市| 松潘县| 大洼县| 华亭县| 绥芬河市|