您好,登錄后才能下訂單哦!
這篇文章主要講解了“Redis事件驅動模型是什么”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Redis事件驅動模型是什么”吧!
多路”指的是多個網絡連接,“復用”指的是復用同一個線程
多路I/O復用模型是利用 select、poll、epoll 可以同時監察多個流的 I/O 事件的能力,在空閑的時候,會把當前線程阻塞掉,當有一個或多個流有 I/O 事件時,就從阻塞態中喚醒,于是程序就會輪詢一遍所有的流(epoll 是只輪詢那些真正發出了事件的流),并且只依次順序的處理就緒的流,這種做法就避免了大量的無用操作
redis使用多路復用技術,可以處理并發的連接。非阻塞IO 內部實現采用epoll,采用了epoll+自己實現的簡單的事件框架。epoll中的讀、寫、關閉、連接都轉化成了事件,然后利用epoll的多路復用特性,絕不在io上浪費一點時間
Redis服務器是一個事件驅動程序,主要處理以下兩類事件:
文件事件:文件事件其實就是對Socket操作的抽象,Redis服務器與Redis客戶端的通信會產生文件事件,服務器通過監聽并處理這些事件來完成一系列的網絡操作
時間事件:時間事件其實就是對定時操作的抽象,前面我們已經講了RDB、AOF、定時刪除鍵這些操作都可以由服務端去定時或者周期去完成,底層就是通過觸發時間事件來實現的
2.1 文件事件
文件事件是對套接字操作的抽象, 每當一個套接字準備好執行連接應答(accept)、寫入、讀取、關閉等操作時, 就會產生一個文件事件。 因為一個服務器通常會連接多個套接字, 所以多個文件事件有可能會并發地出現
Redis 基于 Reactor 模式開發了自己的事件處理器
盡管多個文件事件可能會并發地出現, 但 I/O 多路復用程序總是會將所有產生事件的套接字都入隊到一個隊列里面, 然后通過這個隊列, 以有序(sequentially)、同步(synchronously)、每次一個套接字的方式向文件事件分派器傳送套接字: 當上一個套接字產生的事件被處理完畢之后(該套接字為事件所關聯的事件處理器執行完畢), I/O 多路復用程序才會繼續向文件事件分派器傳送下一個套接字.
Redis 客戶端與服務器進行連接并發送命令的整個過程
Redis 客戶端向服務器發起連接
監聽套接字將產生 AE_READABLE
事件, 觸發連接應答處理器執行: 處理器會對客戶端的連接請求進行應答, 然后創建客戶端套接字, 以及客戶端狀態, 并將客戶端套接字的 AE_READABLE
事件與命令請求處理器進行關聯, 使得客戶端可以向主服務器發送命令請求
客戶端向主服務器發送一個命令請求, 那么客戶端套接字將產生 AE_READABLE
事件,發命令請求處理器執行, 處理器讀取客戶端的命令內容, 然后傳給相關程序去執行
執行命令將產生相應的命令回復, 為了將這些命令回復傳送回客戶端, 服務器會將客戶端套接字的 AE_WRITABLE
事件與命令回復處理器進行關聯: 當客戶端嘗試讀取命令回復的時候, 客戶端套接字將產生 AE_WRITABLE
事件, 觸發命令回復處理器執行, 當命令回復處理器將命令回復全部寫入到套接字之后, 服務器就會解除客戶端套接字的 AE_WRITABLE
事件與命令回復處理器之間的關聯
2.2 時間事件
持續運行的Redis服務器會定期對自身的資源和狀態進行檢查和調整,這些定期的操作由serverCron函數負責執行,它的主要工作包括:
更新服務器的統計信息(時間、內存占用、數據庫占用)
清理數據庫的過期鍵值對
AOF、RDB持久化
如果是主從服務器,對從服務器進行定期同步
如果是集群模式,對進群進行定期同步和連接
Redis服務器將時間事件放在一個鏈表中,當時間事件執行器運行時,會遍歷整個鏈表。時間事件包括:
周期性事件(Redis一般只執行serverCron時間事件,serverCron時間事件是周期性的)
定時事件
執行思路:
記錄最新一次執行這個函數的時間,用于處理系統時間被修改產生的問題。
遍歷鏈表找出所有 when_sec 和 when_ms 小于現在時間的事件。
執行事件對應的處理函數。
檢查事件類型,如果是周期事件則刷新該事件下一次的執行事件。
否則從列表中刪除事件
感謝各位的閱讀,以上就是“Redis事件驅動模型是什么”的內容了,經過本文的學習后,相信大家對Redis事件驅動模型是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。