Redis-I/O模型

思維導(dǎo)圖

Redis 單線程是指Redis的網(wǎng)絡(luò)IO和鍵值對讀寫是由一個線程完成。這也是Redis提供存儲服務(wù)的主流程。

一、Redis 單線程原因

對于一個多線程系統(tǒng),在合理的資源分配情況下,提高線程數(shù),可以有效的提高系統(tǒng)的吞吐量。但實際情況可能是,剛增加線程數(shù)時,系統(tǒng)吞吐量增加,但進一步增加線程數(shù),吞吐量增長緩慢,甚至下降。

出現(xiàn)這種情況的原因是系統(tǒng)中多線程可能會競爭同一個臨界資源,為了保證臨界資源的正確性,需要添加額外的機制,比如鎖,而這些額外的機制就會帶來額外的開銷。這就是多線程編程模式面臨的共享資源的并發(fā)訪問控制問題。為了避免這些問題,Redis采用單線程。
Redis 6.0支持多線程,默認不開啟

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

Redis采用多路復(fù)用機制,使其在網(wǎng)絡(luò)I/O操作中可以大量并發(fā)處理客戶端請求,實現(xiàn)高吞吐率。
I/O多路復(fù)用 在單線程中通過記錄跟蹤每一個I/O流的狀態(tài)來管理多個I/O流。select, poll, epoll 都是I/O多路復(fù)用的具體的實現(xiàn)。

1.select/epoll機制

在 Redis 只運行單線程的情況下,該機制允許內(nèi)核中,同時存在多個監(jiān)聽套接字和已連接套接字。內(nèi)核會一直監(jiān)聽這些套接字上的連接請求或數(shù)據(jù)請求。一旦有請求到達,就會交給 Redis 線程處理,這就實現(xiàn)了一個 Redis 線程處理多個 IO 流的效果。

2.Reactor(反應(yīng)器模式)

圖中FD就是套接字,當select/epoll一旦監(jiān)測到FD上有請求到達時,就會出發(fā)相應(yīng)的事件,這些事件會被放進一個事件隊列,Redis 單線程對該事件隊列不斷進行處理。這樣一來,Redis 無需一直輪詢是否有請求實際發(fā)生,這就可以避免造成 CPU 資源浪費。同時,Redis 在對事件隊列中的事件進行處理時,會調(diào)用相應(yīng)的處理函數(shù),這就實現(xiàn)了基于事件的回調(diào)。因為 Redis 一直在對事件隊列進行處理,所以能及時響應(yīng)客戶端請求,提升 Redis 的響應(yīng)性能。
事件到了,在處理,這就是反應(yīng)器模式。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容