這篇文章主要講解了“redis事件驅(qū)動(dòng)模型是什么”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Redis事件驅(qū)動(dòng)模型是什么”吧!
博羅網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)建站,博羅網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為博羅上1000+提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站建設(shè)公司要多少錢,請(qǐng)找那個(gè)售后服務(wù)好的博羅做網(wǎng)站的公司定做!
多路”指的是多個(gè)網(wǎng)絡(luò)連接,“復(fù)用”指的是復(fù)用同一個(gè)線程
多路I/O復(fù)用模型是利用 select、poll、epoll 可以同時(shí)監(jiān)察多個(gè)流的 I/O 事件的能力,在空閑的時(shí)候,會(huì)把當(dāng)前線程阻塞掉,當(dāng)有一個(gè)或多個(gè)流有 I/O 事件時(shí),就從阻塞態(tài)中喚醒,于是程序就會(huì)輪詢一遍所有的流(epoll 是只輪詢那些真正發(fā)出了事件的流),并且只依次順序的處理就緒的流,這種做法就避免了大量的無用操作
redis使用多路復(fù)用技術(shù),可以處理并發(fā)的連接。非阻塞IO 內(nèi)部實(shí)現(xiàn)采用epoll,采用了epoll+自己實(shí)現(xiàn)的簡(jiǎn)單的事件框架。epoll中的讀、寫、關(guān)閉、連接都轉(zhuǎn)化成了事件,然后利用epoll的多路復(fù)用特性,絕不在io上浪費(fèi)一點(diǎn)時(shí)間
Redis服務(wù)器是一個(gè)事件驅(qū)動(dòng)程序,主要處理以下兩類事件:
文件事件:文件事件其實(shí)就是對(duì)Socket操作的抽象,Redis服務(wù)器與Redis客戶端的通信會(huì)產(chǎn)生文件事件,服務(wù)器通過監(jiān)聽并處理這些事件來完成一系列的網(wǎng)絡(luò)操作
時(shí)間事件:時(shí)間事件其實(shí)就是對(duì)定時(shí)操作的抽象,前面我們已經(jīng)講了RDB、AOF、定時(shí)刪除鍵這些操作都可以由服務(wù)端去定時(shí)或者周期去完成,底層就是通過觸發(fā)時(shí)間事件來實(shí)現(xiàn)的
2.1 文件事件
文件事件是對(duì)套接字操作的抽象, 每當(dāng)一個(gè)套接字準(zhǔn)備好執(zhí)行連接應(yīng)答(accept)、寫入、讀取、關(guān)閉等操作時(shí), 就會(huì)產(chǎn)生一個(gè)文件事件。 因?yàn)橐粋€(gè)服務(wù)器通常會(huì)連接多個(gè)套接字, 所以多個(gè)文件事件有可能會(huì)并發(fā)地出現(xiàn)
Redis 基于 Reactor 模式開發(fā)了自己的事件處理器
盡管多個(gè)文件事件可能會(huì)并發(fā)地出現(xiàn), 但 I/O 多路復(fù)用程序總是會(huì)將所有產(chǎn)生事件的套接字都入隊(duì)到一個(gè)隊(duì)列里面, 然后通過這個(gè)隊(duì)列, 以有序(sequentially)、同步(synchronously)、每次一個(gè)套接字的方式向文件事件分派器傳送套接字: 當(dāng)上一個(gè)套接字產(chǎn)生的事件被處理完畢之后(該套接字為事件所關(guān)聯(lián)的事件處理器執(zhí)行完畢), I/O 多路復(fù)用程序才會(huì)繼續(xù)向文件事件分派器傳送下一個(gè)套接字.
Redis 客戶端與服務(wù)器進(jìn)行連接并發(fā)送命令的整個(gè)過程
Redis 客戶端向服務(wù)器發(fā)起連接
監(jiān)聽套接字將產(chǎn)生 AE_READABLE
事件, 觸發(fā)連接應(yīng)答處理器執(zhí)行: 處理器會(huì)對(duì)客戶端的連接請(qǐng)求進(jìn)行應(yīng)答, 然后創(chuàng)建客戶端套接字, 以及客戶端狀態(tài), 并將客戶端套接字的 AE_READABLE
事件與命令請(qǐng)求處理器進(jìn)行關(guān)聯(lián), 使得客戶端可以向主服務(wù)器發(fā)送命令請(qǐng)求
客戶端向主服務(wù)器發(fā)送一個(gè)命令請(qǐng)求, 那么客戶端套接字將產(chǎn)生 AE_READABLE
事件,發(fā)命令請(qǐng)求處理器執(zhí)行, 處理器讀取客戶端的命令內(nèi)容, 然后傳給相關(guān)程序去執(zhí)行
執(zhí)行命令將產(chǎn)生相應(yīng)的命令回復(fù), 為了將這些命令回復(fù)傳送回客戶端, 服務(wù)器會(huì)將客戶端套接字的 AE_WRITABLE
事件與命令回復(fù)處理器進(jìn)行關(guān)聯(lián): 當(dāng)客戶端嘗試讀取命令回復(fù)的時(shí)候, 客戶端套接字將產(chǎn)生 AE_WRITABLE
事件, 觸發(fā)命令回復(fù)處理器執(zhí)行, 當(dāng)命令回復(fù)處理器將命令回復(fù)全部寫入到套接字之后, 服務(wù)器就會(huì)解除客戶端套接字的 AE_WRITABLE
事件與命令回復(fù)處理器之間的關(guān)聯(lián)
2.2 時(shí)間事件
持續(xù)運(yùn)行的Redis服務(wù)器會(huì)定期對(duì)自身的資源和狀態(tài)進(jìn)行檢查和調(diào)整,這些定期的操作由serverCron函數(shù)負(fù)責(zé)執(zhí)行,它的主要工作包括:
更新服務(wù)器的統(tǒng)計(jì)信息(時(shí)間、內(nèi)存占用、數(shù)據(jù)庫占用)
清理數(shù)據(jù)庫的過期鍵值對(duì)
AOF、RDB持久化
如果是主從服務(wù)器,對(duì)從服務(wù)器進(jìn)行定期同步
如果是集群模式,對(duì)進(jìn)群進(jìn)行定期同步和連接
Redis服務(wù)器將時(shí)間事件放在一個(gè)鏈表中,當(dāng)時(shí)間事件執(zhí)行器運(yùn)行時(shí),會(huì)遍歷整個(gè)鏈表。時(shí)間事件包括:
周期性事件(Redis一般只執(zhí)行serverCron時(shí)間事件,serverCron時(shí)間事件是周期性的)
定時(shí)事件
執(zhí)行思路:
記錄最新一次執(zhí)行這個(gè)函數(shù)的時(shí)間,用于處理系統(tǒng)時(shí)間被修改產(chǎn)生的問題。
遍歷鏈表找出所有 when_sec 和 when_ms 小于現(xiàn)在時(shí)間的事件。
執(zhí)行事件對(duì)應(yīng)的處理函數(shù)。
檢查事件類型,如果是周期事件則刷新該事件下一次的執(zhí)行事件。
否則從列表中刪除事件
感謝各位的閱讀,以上就是“Redis事件驅(qū)動(dòng)模型是什么”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)Redis事件驅(qū)動(dòng)模型是什么這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
本文題目:Redis事件驅(qū)動(dòng)模型是什么
新聞來源:http://jinyejixie.com/article38/pdcgsp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供虛擬主機(jī)、微信公眾號(hào)、營(yíng)銷型網(wǎng)站建設(shè)、企業(yè)建站、關(guān)鍵詞優(yōu)化、動(dòng)態(tài)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)