欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Redis是單線程的嗎

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

Redis為什么是單線程的

為什么需要多線程

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

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

如何理解redis的單線程

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

redis為什么使用單線程

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

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

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

綜上所述,Redis為了保持簡單和高效,自然而然地就使用了單線程。

redis如何提高CPU的使用率

前面也提過,現(xiàn)在的CPU一般都有多個核心,每個核心可以單獨執(zhí)行。Redis處理客戶端請求使用單線程,那么自然而然,無法將CPU的所有核心都占用,也就造成了資源的浪費。而解決的方式也比較簡單,我們可以在同一個服務器上開啟多個Redis程序,每個Redis程序使用不同的端口,相互獨立,以此提高CPU的使用率。而這多個Redis程序可以配置成主從節(jié)點,共同為一個程序服務,也可以相互獨立,服務于多個程序。

總結(jié)

以上就對Redis為何使用單線程,做了一個大致的介紹,總的來說,Redis使用單線程的原因就是:多線程并不能有效提升Redis的性能,相反可能還會降低性能,所以自然而然使用單線程。

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

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

1.redis是基于內(nèi)存的,內(nèi)存的讀寫速度非???;

2.redis是單線程的,省去了很多上下文切換線程的時間;

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

下面重點介紹單線程設計和IO多路復用核心設計快的原因。

為什么Redis是單線程的

1.官方答案

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

2.性能指標

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

3.詳細原因

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

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

一個對象。這些操作可能就需要加非常多的鎖,導致的結(jié)果是同步開銷大大增加。

總之,在單線程的情況下,就不用去考慮各種鎖的問題,不存在加鎖釋放鎖操作,沒有因為可能出現(xiàn)死鎖而導致的性能消耗。

2)單線程多進程集群方案

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

所以單線程、多進程的集群不失為一個時髦的解決方案。

3)CPU消耗

采用單線程,避免了不必要的上下文切換和競爭條件,也不存在多進程或者多線程導致的切換而消耗 CPU。

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

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

Redis單線程的優(yōu)劣勢

1.單進程單線程優(yōu)勢

 代碼更清晰,處理邏輯更簡單 不用去考慮各種鎖的問題,不存在加鎖釋放鎖操作,沒有因為可能出現(xiàn)死鎖而導致的性能消耗 不存在多進程或者多線程導致的切換而消耗CPU

2.單進程單線程弊端

 無法發(fā)揮多核CPU性能,不過可以通過在單機開多個Redis實例來完善; IO多路復用技術(shù)

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

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

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

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

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

2. 再說一下IO,Redis使用的是非阻塞IO,IO多路復用,使用了單線程來輪詢描述符,將數(shù)據(jù)庫的開、關(guān)、讀、寫都轉(zhuǎn)換成了事件,減少了線程切換時上下文的切換和競爭。

3. Redis采用了單線程的模型,保證了每個操作的原子性,也減少了線程的上下文切換和競爭。

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

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

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

相關(guān)文章

  • Redis中Lua腳本的使用和設置超時

    Redis中Lua腳本的使用和設置超時

    本文將介紹Redis中Lua腳本的基本用法,以及腳本超時導致的問題和處理方式。文中通過示例代碼介紹的非常詳細,感興趣的小伙伴們可以參考一下
    2021-11-11
  • Redis配置外網(wǎng)可訪問(redis遠程連接不上)的方法

    Redis配置外網(wǎng)可訪問(redis遠程連接不上)的方法

    默認情況下,當我們在部署了redis服務之后,redis本身默認只允許本地訪問。Redis服務端只允許它所在服務器上的客戶端訪問,如果Redis服務端和Redis客戶端不在同一個機器上,就要進行配置。
    2022-12-12
  • redis中跳表zset的具體使用

    redis中跳表zset的具體使用

    Redis跳表zset是一種結(jié)合了跳表和有序集合的高效數(shù)據(jù)結(jié)構(gòu),適用于實現(xiàn)排序和大規(guī)模數(shù)據(jù)的快速查詢,本文主要介紹了redis中跳表zset的具體使用,感興趣的可以了解一下
    2024-01-01
  • 基于redis實現(xiàn)世界杯排行榜功能項目實戰(zhàn)

    基于redis實現(xiàn)世界杯排行榜功能項目實戰(zhàn)

    前段時間,做了一個世界杯競猜積分排行榜。對世界杯64場球賽勝負平進行猜測,猜對+1分,錯誤+0分,一人一場只能猜一次。下面通過本文給大家分享基于redis實現(xiàn)世界杯排行榜功能項目實戰(zhàn),感興趣的朋友一起看看吧
    2018-10-10
  • redis加鎖的三種方式小結(jié)

    redis加鎖的三種方式小結(jié)

    本文主要介紹了redis加鎖的三種方式小結(jié),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-01-01
  • Window server中安裝Redis的超詳細教程

    Window server中安裝Redis的超詳細教程

    這篇文章主要介紹了Window server中安裝Redis的教程,本文通過圖文實例代碼相結(jié)合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-11-11
  • Redis的Hash類型及相關(guān)命令小結(jié)

    Redis的Hash類型及相關(guān)命令小結(jié)

    edis Hash是一種數(shù)據(jù)結(jié)構(gòu),用于存儲字段和值的映射關(guān)系,本文就來介紹一下Redis的Hash類型及相關(guān)命令小結(jié),具有一定的參考價值,感興趣的可以了解一下
    2025-01-01
  • Redis設置鍵的生存時間或過期時間的方法詳解

    Redis設置鍵的生存時間或過期時間的方法詳解

    這篇文章主要介紹了Redis如何設置鍵的生存時間或過期時間,通過EXPIRE命令或者PEXIPIRE命令,客戶端可以以秒或者毫秒精度為數(shù)據(jù)庫中的某個鍵設置生存時間,文中有詳細的代碼供供大家參考,需要的朋友可以參考下
    2024-03-03
  • Win10配置redis服務實現(xiàn)過程詳解

    Win10配置redis服務實現(xiàn)過程詳解

    這篇文章主要介紹了Win10配置redis服務實現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-07-07
  • Redis集群的實現(xiàn)全過程

    Redis集群的實現(xiàn)全過程

    Redis集群的實現(xiàn)方案主要有客戶端分片、代理模式和Cluster模式,其中,Cluster模式是Redis官方推薦的實現(xiàn)方案,它具有高可用性、高性能和自動分片等優(yōu)點
    2024-12-12

最新評論