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

關(guān)于Redis單線程的正確理解

 更新時(shí)間:2021年11月12日 11:06:18   作者:小白菜_1  
很多同學(xué)對(duì)Redis的單線程和I/O多路復(fù)用技術(shù)并不是很了解,所以我用簡(jiǎn)單易懂的語(yǔ)言讓大家了解下Redis單線程和I/O多路復(fù)用技術(shù)的原理,對(duì)學(xué)好和運(yùn)用好Redis打下基礎(chǔ),感興趣的朋友跟隨小編一起看看吧

很多同學(xué)對(duì)Redis的單線程和I/O多路復(fù)用技術(shù)并不是很了解,所以我用簡(jiǎn)單易懂的語(yǔ)言讓大家了解下Redis單線程和I/O多路復(fù)用技術(shù)的原理,對(duì)學(xué)好和運(yùn)用好Redis打下基礎(chǔ)。

一、Redis的單線程理解

Redis客戶端對(duì)服務(wù)端的每次調(diào)用都經(jīng)歷了發(fā)送命令,執(zhí)行命令,返回結(jié)果三個(gè)過(guò)程。其中執(zhí)行命令階段,由于Redis是單線程來(lái)處理命令的,所有到達(dá)服務(wù)端的命令都不會(huì)立刻執(zhí)行,所有的命令都會(huì)進(jìn)入一個(gè)隊(duì)列中,然后逐個(gè)執(zhí)行,并且多個(gè)客戶端發(fā)送的命令的執(zhí)行順序是不確定的,但是可以確定的是不會(huì)有兩條命令被同時(shí)執(zhí)行,不會(huì)產(chǎn)生并發(fā)問(wèn)題,這就是Redis的單線程基本模型。

Redis服務(wù)器通過(guò)socket(套接字)與客戶端或其他Redis服務(wù)器進(jìn)行連接,而文件事件就是服務(wù)器對(duì)socket操作的抽象。服務(wù)器與客戶端或其他服務(wù)器的通信會(huì)產(chǎn)生相應(yīng)的文件事件,而服務(wù)器通過(guò)監(jiān)聽(tīng)并處理這些事件來(lái)完成一系列網(wǎng)絡(luò)通信操作。

Redis基于Reactor模式開(kāi)發(fā)了自己的網(wǎng)絡(luò)事件處理器——文件事件處理器,文件事件處理器使用I/O多路復(fù)用程序來(lái)同時(shí)監(jiān)聽(tīng)多個(gè)socket(I/O多路復(fù)用技術(shù)下面有介紹),并根據(jù)socket目前執(zhí)行的任務(wù)來(lái)為socket關(guān)聯(lián)不同的事件處理器。當(dāng)被監(jiān)聽(tīng)的socket準(zhǔn)備好執(zhí)行連接應(yīng)答、讀取、寫(xiě)入、關(guān)閉等操作時(shí),與操作相對(duì)應(yīng)的文件事件就會(huì)產(chǎn)生,這時(shí)文件事件處理器就會(huì)調(diào)用socket之前已關(guān)聯(lián)好的事件處理器來(lái)處理這些事件。

文件事件處理器的構(gòu)成:

                                                    

注意:其中I/O多路復(fù)用程序通過(guò)隊(duì)列向文件事件分派器傳送socket

二、I/O多路復(fù)用技術(shù)

關(guān)于I/O多路復(fù)用(又被稱為“事件驅(qū)動(dòng)”),首先要理解的是,操作系統(tǒng)為你提供了一個(gè)功能,當(dāng)你的某個(gè)socket可讀或者可寫(xiě)的時(shí)候,它可以給你一個(gè)通知。這樣當(dāng)配合非阻塞的socket使用時(shí),只有當(dāng)系統(tǒng)通知我哪個(gè)描述符可讀了,我才去執(zhí)行read操作,可以保證每次read都能讀到有效數(shù)據(jù)而不做純返回-1和EAGAIN的無(wú)用功,寫(xiě)操作類似。

操作系統(tǒng)的這個(gè)功能是通過(guò)select/poll/epoll/kqueue之類的系統(tǒng)調(diào)用函數(shù)來(lái)實(shí)現(xiàn),這些函數(shù)都可以同時(shí)監(jiān)視多個(gè)描述符的讀寫(xiě)就緒狀況,這樣,多個(gè)描述符的I/O操作都能在一個(gè)線程內(nèi)并發(fā)交替地順序完成,這就叫I/O多路復(fù)用,這里的“多路”指的是多個(gè)網(wǎng)絡(luò)連接,“復(fù)用”指的是復(fù)用同一個(gè)Redis處理線程。(正如上圖所示)

采用多路 I/O 復(fù)用技術(shù)可以讓單個(gè)線程高效的處理多個(gè)連接請(qǐng)求(盡量減少網(wǎng)絡(luò) I/O 的時(shí)間消耗),且 Redis 在內(nèi)存中操作數(shù)據(jù)的速度非??欤簿褪钦f(shuō)內(nèi)存內(nèi)的操作不會(huì)成為影響Redis性能的瓶頸,所有 Redis 具有很高的吞吐量。

三、常見(jiàn)疑問(wèn)解答

1、Redis的單線程為什么這么快?

1.完全基于內(nèi)存,絕大部分請(qǐng)求是純粹的內(nèi)存操作,非??焖?。數(shù)據(jù)存在內(nèi)存中,類似于HashMap,HashMap的優(yōu)勢(shì)就是查找和操作的時(shí)間復(fù)雜度都是O(1);

2.數(shù)據(jù)結(jié)構(gòu)簡(jiǎn)單,對(duì)數(shù)據(jù)操作也簡(jiǎn)單,Redis中的數(shù)據(jù)結(jié)構(gòu)是專門(mén)進(jìn)行設(shè)計(jì)的;

3.采用單線程,避免了不必要的上下文切換和競(jìng)爭(zhēng)條件,也不存在多進(jìn)程或者多線程導(dǎo)致的切換而消耗 CPU,不用去考慮各種鎖的問(wèn)題,不存在加鎖釋放鎖操作,沒(méi)有因?yàn)榭赡艹霈F(xiàn)死鎖而導(dǎo)致的性能消耗;

4.使用多路I/O復(fù)用模型,非阻塞I/O;

5.Redis直接自己構(gòu)建了VM 機(jī)制 ,因?yàn)橐话愕南到y(tǒng)調(diào)用系統(tǒng)函數(shù)的話,會(huì)浪費(fèi)一定的時(shí)間去移動(dòng)和請(qǐng)求;

2、為什么不采用多進(jìn)程或多線程處理?

1.多線程處理可能涉及到鎖

2.多線程處理會(huì)涉及到線程切換而消耗CPU

3、單線程處理的缺點(diǎn)?

1.耗時(shí)的命令會(huì)導(dǎo)致并發(fā)的下降,不只是讀并發(fā),寫(xiě)并發(fā)也會(huì)下降

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

4、Redis不存在線程安全問(wèn)題?

Redis采用了線程封閉的方式,把任務(wù)封閉在一個(gè)線程,自然避免了線程安全問(wèn)題,不過(guò)對(duì)于需要依賴多個(gè)redis操作(即:多個(gè)Redis操作命令)的復(fù)合操作來(lái)說(shuō),依然需要鎖,而且有可能是分布式鎖。

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

相關(guān)文章

  • Python交互Redis的實(shí)現(xiàn)

    Python交互Redis的實(shí)現(xiàn)

    本文主要介紹了Python交互Redis的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • redis哨兵常用命令和監(jiān)控示例詳解

    redis哨兵常用命令和監(jiān)控示例詳解

    哨兵模式是一種特殊的模式,首先Redis提供了哨兵的命令,哨兵是一個(gè)獨(dú)立的進(jìn)程,作為進(jìn)程,它會(huì)獨(dú)立運(yùn)行,接下來(lái)通過(guò)本文給大家講解redis哨兵常用命令和監(jiān)控知識(shí),感興趣的朋友一起學(xué)習(xí)吧
    2021-05-05
  • redis中bind配置的詳細(xì)步驟

    redis中bind配置的詳細(xì)步驟

    本文主要介紹了redis中bind配置的詳細(xì)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • 通過(guò)kubesphere部署redis的方法

    通過(guò)kubesphere部署redis的方法

    這篇文章主要介紹了通過(guò)kubesphere部署redis的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • 大白話講解調(diào)用Redis的increment失敗原因及推薦使用詳解

    大白話講解調(diào)用Redis的increment失敗原因及推薦使用詳解

    本文主要介紹了調(diào)用Redis的increment失敗原因及推薦使用,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • 一文詳解Redis中的持久化

    一文詳解Redis中的持久化

    這篇文章主要介紹了一文詳解Redis中的持久化,持久化功能有效地避免因進(jìn)程退出造成的數(shù)據(jù)丟失問(wèn)題,當(dāng)下次重啟時(shí)利用之前持久化的文件即可實(shí)現(xiàn)數(shù)據(jù)恢復(fù)
    2022-09-09
  • redis事務(wù)_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    redis事務(wù)_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    這篇文章主要介紹了redis事務(wù),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-08-08
  • 淺談Redis的幾個(gè)過(guò)期策略

    淺談Redis的幾個(gè)過(guò)期策略

    在使用redis時(shí),一般會(huì)設(shè)置一個(gè)過(guò)期時(shí)間,當(dāng)然也有不設(shè)置過(guò)期時(shí)間的,也就是永久不過(guò)期。當(dāng)設(shè)置了過(guò)期時(shí)間,redis是如何判斷是否過(guò)期,以及根據(jù)什么策略來(lái)進(jìn)行刪除的。
    2021-05-05
  • Redis?哈希Hash底層數(shù)據(jù)結(jié)構(gòu)詳解

    Redis?哈希Hash底層數(shù)據(jù)結(jié)構(gòu)詳解

    這篇文章主要介紹了Redis?哈希Hash底層數(shù)據(jù)結(jié)構(gòu)詳解的相關(guān)資料,需要的朋友可以參考下
    2022-08-08
  • 詳解Redis如何保證接口的冪等性

    詳解Redis如何保證接口的冪等性

    如何防止接口中同樣的數(shù)據(jù)提交,以及如何保證消息不被重復(fù)消費(fèi),這些都是shigen在學(xué)習(xí)的過(guò)程中遇到的問(wèn)題,今天,趁著在學(xué)習(xí)redis的間隙,我寫(xiě)了一篇文章進(jìn)行簡(jiǎn)單的實(shí)現(xiàn),需要的朋友可以參考下
    2023-11-11

最新評(píng)論