<del id="d4fwx"><form id="d4fwx"></form></del>
      <del id="d4fwx"><form id="d4fwx"></form></del><del id="d4fwx"><form id="d4fwx"></form></del>

            <code id="d4fwx"><abbr id="d4fwx"></abbr></code>
          • 為什么說redis是單線程的

            這篇文章主要介紹為什么說redis是單線程的,文中介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們一定要看完!

            創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供南山網(wǎng)站建設(shè)、南山做網(wǎng)站、南山網(wǎng)站設(shè)計、南山網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計與制作、南山企業(yè)網(wǎng)站模板建站服務(wù),十多年南山做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡(luò)服務(wù)。

            Redis即遠(yuǎn)程字典服務(wù),是一個開源的使用ANSI C語言編寫、支持網(wǎng)絡(luò)、可基于內(nèi)存亦可持久化的日志型、Key-Value數(shù)據(jù)庫,并提供多種語言的API。

            文件事件處理器

            Redis基于Reactor模式開發(fā)了網(wǎng)絡(luò)事件處理器,這個處理器被稱為文件事件處理器。它的組成結(jié)構(gòu)為4部分:多個套接字、IO多路復(fù)用程序、文件事件分派器、事件處理器。因為文件事件分派器隊列的消費是單線程的,所以Redis才叫單線程模型。

            為什么說redis是單線程的

            消息處理流程

            文件事件處理器使用I/O多路復(fù)用(multiplexing)程序來同時監(jiān)聽多個套接字,并根據(jù)套接字目前執(zhí)行的任務(wù)來為套接字關(guān)聯(lián)不同的事件處理器。

            當(dāng)被監(jiān)聽的套接字準(zhǔn)備好執(zhí)行連接應(yīng)答(accept)、讀取(read)、寫入(write)、關(guān)閉(close)等操作時,與操作相對應(yīng)的文件事件就會產(chǎn)生,這時文件事件處理器就會調(diào)用套接字之前關(guān)聯(lián)好的事件處理器來處理這些事件。

            盡管多個文件事件可能會并發(fā)地出現(xiàn),但I(xiàn)/O多路復(fù)用程序總是會將所有產(chǎn)生事件的套接字都推到一個隊列里面,然后通過這個隊列,以有序(sequentially)、同步(synchronously)、每次一個套接字的方式向文件事件分派器傳送套接字:當(dāng)上一個套接字產(chǎn)生的事件被處理完畢之后(該套接字為事件所關(guān)聯(lián)的事件處理器執(zhí)行完畢), I/O多路復(fù)用程序才會繼續(xù)向文件事件分派器傳送下一個套接字。

            I/O 多路復(fù)用程序的實現(xiàn)

            Redis的I/O多路復(fù)用程序的所有功能是通過包裝select、epoll、evport和kqueue這些I/O多路復(fù)用函數(shù)庫來實現(xiàn)的,每個I/O多路復(fù)用函數(shù)庫在Redis源碼中都對應(yīng)一個單獨的文件,比如ae_select.c、ae_epoll.c、ae_kqueue.c等。

            因為Redis為每個I/O多路復(fù)用函數(shù)庫都實現(xiàn)了相同的API,所以I/O多路復(fù)用程序的底層實現(xiàn)是可以互換的,如下圖所示。

            為什么說redis是單線程的

            有關(guān)epoll的詳細(xì)講解,可以點擊查看,徹底搞懂epoll高效運行的原理

            Redis在I/O多路復(fù)用程序的實現(xiàn)源碼中用#include宏定義了相應(yīng)的規(guī)則,程序會在編譯時自動選擇系統(tǒng)中性能最好的I/O多路復(fù)用函數(shù)庫來作為Redis的I/O多路復(fù)用程序的底層實現(xiàn):

            /* Include the best multiplexing layer supported by this system.
             * The following should be ordered by performances, descending. */
            #ifdef HAVE_EVPORT
            #include "ae_evport.c"
            #else
                #ifdef HAVE_EPOLL
                #include "ae_epoll.c"
                #else
                    #ifdef HAVE_KQUEUE
                    #include "ae_kqueue.c"
                    #else
                    #include "ae_select.c"
                    #endif
                #endif
            #endif

            文件事件的類型

            I/O 多路復(fù)用程序可以監(jiān)聽多個套接字的ae.h/AE_READABLE事件和ae.h/AE_WRITABLE事件,這兩類事件和套接字操作之間的對應(yīng)關(guān)系如下:

            當(dāng)套接字變得可讀時(客戶端對套接字執(zhí)行write操作,或者執(zhí)行close操作),或者有新的可應(yīng)答(acceptable)套接字出現(xiàn)時(客戶端對服務(wù)器的監(jiān)聽套接字執(zhí)行connect操作),套接字產(chǎn)生AE_READABLE 事件。

            當(dāng)套接字變得可寫時(客戶端對套接字執(zhí)行read操作),套接字產(chǎn)生AE_WRITABLE事件。I/O多路復(fù)用程序允許服務(wù)器同時監(jiān)聽套接字的AE_READABLE事件和AE_WRITABLE事件,如果一個套接字同時產(chǎn)生了這兩種事件,那么文件事件分派器會優(yōu)先處理AE_READABLE事件,等到AE_READABLE事件處理完之后,才處理AE_WRITABLE 事件。這也就是說,如果一個套接字又可讀又可寫的話,那么服務(wù)器將先讀套接字,后寫套接字。

            文件事件的處理器

            Redis為文件事件編寫了多個處理器,這些事件處理器分別用于實現(xiàn)不同的網(wǎng)絡(luò)通訊需求,常用的處理器如下:

            為了對連接服務(wù)器的各個客戶端進(jìn)行應(yīng)答, 服務(wù)器要為監(jiān)聽套接字關(guān)聯(lián)連接應(yīng)答處理器。

            為了接收客戶端傳來的命令請求, 服務(wù)器要為客戶端套接字關(guān)聯(lián)命令請求處理器。

            為了向客戶端返回命令的執(zhí)行結(jié)果, 服務(wù)器要為客戶端套接字關(guān)聯(lián)命令回復(fù)處理器。

            連接應(yīng)答處理器

            networking.c中acceptTcpHandler函數(shù)是Redis的連接應(yīng)答處理器,這個處理器用于對連接服務(wù)器監(jiān)聽套接字的客戶端進(jìn)行應(yīng)答,具體實現(xiàn)為sys/socket.h/accept函數(shù)的包裝。

            當(dāng)Redis服務(wù)器進(jìn)行初始化的時候,程序會將這個連接應(yīng)答處理器和服務(wù)器監(jiān)聽套接字的AE_READABLE事件關(guān)聯(lián)起來,當(dāng)有客戶端用sys/socket.h/connect函數(shù)連接服務(wù)器監(jiān)聽套接字的時候, 套接字就會產(chǎn)生AE_READABLE 事件, 引發(fā)連接應(yīng)答處理器執(zhí)行, 并執(zhí)行相應(yīng)的套接字應(yīng)答操作,如圖所示。

            為什么說redis是單線程的

            命令請求處理器

            networking.c中readQueryFromClient函數(shù)是Redis的命令請求處理器,這個處理器負(fù)責(zé)從套接字中讀入客戶端發(fā)送的命令請求內(nèi)容, 具體實現(xiàn)為unistd.h/read函數(shù)的包裝。

            當(dāng)一個客戶端通過連接應(yīng)答處理器成功連接到服務(wù)器之后, 服務(wù)器會將客戶端套接字的AE_READABLE事件和命令請求處理器關(guān)聯(lián)起來,當(dāng)客戶端向服務(wù)器發(fā)送命令請求的時候,套接字就會產(chǎn)生 AE_READABLE事件,引發(fā)命令請求處理器執(zhí)行,并執(zhí)行相應(yīng)的套接字讀入操作,如圖所示。

            為什么說redis是單線程的

            在客戶端連接服務(wù)器的整個過程中,服務(wù)器都會一直為客戶端套接字的AE_READABLE事件關(guān)聯(lián)命令請求處理器。

            命令回復(fù)處理器

            networking.c中sendReplyToClient函數(shù)是Redis的命令回復(fù)處理器,這個處理器負(fù)責(zé)將服務(wù)器執(zhí)行命令后得到的命令回復(fù)通過套接字返回給客戶端,具體實現(xiàn)為unistd.h/write函數(shù)的包裝。

            當(dāng)服務(wù)器有命令回復(fù)需要傳送給客戶端的時候,服務(wù)器會將客戶端套接字的AE_WRITABLE事件和命令回復(fù)處理器關(guān)聯(lián)起來,當(dāng)客戶端準(zhǔn)備好接收服務(wù)器傳回的命令回復(fù)時,就會產(chǎn)生AE_WRITABLE事件,引發(fā)命令回復(fù)處理器執(zhí)行,并執(zhí)行相應(yīng)的套接字寫入操作, 如圖所示。

            為什么說redis是單線程的

            當(dāng)命令回復(fù)發(fā)送完畢之后, 服務(wù)器就會解除命令回復(fù)處理器與客戶端套接字的 AE_WRITABLE 事件之間的關(guān)聯(lián)。

            一次完整的客戶端與服務(wù)器連接事件示例

            假設(shè)Redis服務(wù)器正在運作,那么這個服務(wù)器的監(jiān)聽套接字的AE_READABLE事件應(yīng)該正處于監(jiān)聽狀態(tài)之下,而該事件所對應(yīng)的處理器為連接應(yīng)答處理器。

            如果這時有一個Redis客戶端向Redis服務(wù)器發(fā)起連接,那么監(jiān)聽套接字將產(chǎn)生AE_READABLE事件, 觸發(fā)連接應(yīng)答處理器執(zhí)行:處理器會對客戶端的連接請求進(jìn)行應(yīng)答, 然后創(chuàng)建客戶端套接字,以及客戶端狀態(tài),并將客戶端套接字的 AE_READABLE 事件與命令請求處理器進(jìn)行關(guān)聯(lián),使得客戶端可以向主服務(wù)器發(fā)送命令請求。

            之后,客戶端向Redis服務(wù)器發(fā)送一個命令請求,那么客戶端套接字將產(chǎn)生 AE_READABLE事件,引發(fā)命令請求處理器執(zhí)行,處理器讀取客戶端的命令內(nèi)容, 然后傳給相關(guān)程序去執(zhí)行。

            執(zhí)行命令將產(chǎn)生相應(yīng)的命令回復(fù),為了將這些命令回復(fù)傳送回客戶端,服務(wù)器會將客戶端套接字的AE_WRITABLE事件與命令回復(fù)處理器進(jìn)行關(guān)聯(lián):當(dāng)客戶端嘗試讀取命令回復(fù)的時候,客戶端套接字將產(chǎn)生AE_WRITABLE事件, 觸發(fā)命令回復(fù)處理器執(zhí)行, 當(dāng)命令回復(fù)處理器將命令回復(fù)全部寫入到套接字之后, 服務(wù)器就會解除客戶端套接字的AE_WRITABLE事件與命令回復(fù)處理器之間的關(guān)聯(lián)。

            為什么說redis是單線程的

            以上是“為什么說redis是單線程的”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

            文章名稱:為什么說redis是單線程的
            網(wǎng)站路徑:http://www.jbt999.com/article40/pdggho.html

            成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站內(nèi)鏈、響應(yīng)式網(wǎng)站、做網(wǎng)站、虛擬主機網(wǎng)站維護、軟件開發(fā)

            廣告

            聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:[email protected]。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

            網(wǎng)站托管運營

              <del id="d4fwx"><form id="d4fwx"></form></del>
              <del id="d4fwx"><form id="d4fwx"></form></del><del id="d4fwx"><form id="d4fwx"></form></del>

                    <code id="d4fwx"><abbr id="d4fwx"></abbr></code>
                  • 激情五月天婷婷 | 激情视频污污污无码 | 91麻豆影院 | 婷婷乱伦视频 | 豆花一区在线视频观看 |