redis——事件

redis服務器是一個事件驅動程序。

需要處理兩類事件:

1)文件事件:redis是通過套接字與客戶端或者其他服務器連接的,而文件事件就是服務器對套接字操作的抽象。

2)時間事件:服務器對一些定時操作的抽象。

文件事件

redis基于reactor模式開發了自己的網絡事件處理器,這個處理器被稱作文件事件處理器,它使用IO多路復用程序來同時監聽多個套接字, 并根據套接字目前執行的任務來為套接字關聯不同的事件處理器,當被監聽的套接字準備好執行連接應答(accept)、讀取(read)、寫入(write)、關閉(close)等操作時, 與操作相對應的文件事件就會產生, 這時文件事件處理器就會調用套接字之前關聯好的事件處理器來處理這些事件。

雖然文件事件處理器以單線程方式運行, 但通過使用 I/O 多路復用程序來監聽多個套接字, 文件事件處理器既實現了高性能的網絡通信模型, 又可以很好地與 Redis 服務器中其他同樣以單線程方式運行的模塊進行對接, 這保持了 Redis 內部單線程設計的簡單性。

文件事件處理器的構成:

I/O 多路復用程序負責監聽多個套接字, 并向文件事件分派器傳送那些產生了事件的套接字。

?I/O 多路復用程序會把所有產生事件的套接字放到一個隊列, 以有序(sequentially)、同步(synchronously)、每次一個套接字的方式,向文件事件分派器傳送套接字。

I/O 多路復用程序可以監聽多個套接字的?ae.h/AE_READABLE?事件和?ae.h/AE_WRITABLE?事件

1)當套接字變得可讀時(客戶端對套接字執行?write?操作,或者執行?close?操作), 或者有新的可應答(acceptable)套接字出現時(客戶端對服務器的監聽套接字執行?connect?操作), 套接字產生?AE_READABLE?事件。

2)當套接字變得可寫時(客戶端對套接字執行?read?操作), 套接字產生?AE_WRITABLE?事件。

如果一個套接字又可讀又可寫的話, 那么服務器將先讀套接字, 后寫套接字。

下面介紹各種處理器:

1)連接應答處理器:服務器進行初始化時, 程序會將連接應答處理器和服務器監聽套接字的?AE_READABLE?事件關聯, 當有客戶端連接(connect)服務器監聽套接字的時候, 套接字就會產生?AE_READABLE?事件, 引發連接應答處理器執行, 并執行相應的套接字應答操作。

2)命令請求處理器:客戶端連接到服務器后, 服務器會將客戶端套接字的?AE_READABLE?事件和命令請求處理器關聯起來, 當客戶端發送命令請求時, 套接字就會產生?AE_READABLE?事件, 引發命令請求處理器執行, 并執行相應的套接字讀入操作

3)命令回復處理器:服務器有命令回復需要傳送給客戶端, 服務器會將客戶端套接字的?AE_WRITABLE?事件和命令回復處理器關聯起來, 當客戶端準備好接收服務器傳回的命令回復時, 就會產生?AE_WRITABLE?事件, 引發命令回復處理器執行, 并執行相應的套接字寫入操作。

一次完整的連接事件實例:

時間事件

redis時間事件可以分為兩類:定時事件、周期性事件,他們的特點就像他們的名字一樣。

而一個時間事件主要有三部分:

id:服務器為時間事件創建的全局唯一id,按時間遞增,越新的越大

when:unix時間戳,記錄到達時間

timeProc:時間事件處理器,是一個函數,時間事件到達時,服務器就會調用處理器來處理事件。

目前版本的redis只使用周期性事件

來看看實現:

服務器把所有時間事件放在一個鏈表中,每當時間事件執行器執行時,它就遍歷鏈表,調用相應的事件處理器。

但是注意:鏈表是無序的,不按when屬性來排序,當時間事件執行器運行時,必須遍歷整個鏈表。但是,無序鏈表并不影響時間事件處理器的性能,因為在目前版本中,redis服務器只使用serverCron一個時間事件,就算在benchmark模式下也只有兩個事件,服務器幾乎是把鏈表退化成指針使用了。

?

事件的調度和執行

?

文件事件和時間事件之間是合作關系, 服務器會輪流處理這兩種事件,對兩種事件的處理都是同步、有序、原子地進行的,處理事件的過程中也不會進行搶占,所以時間事件的實際處理時間通常會比設定的到達時間晚一些

大概流程為:

是否關閉服務器?---->等待文件事件產生---->處理已經產生的文件事件---->處理已經達到的時間事件---->是否關閉服務器?........

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/445379.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/445379.shtml
英文地址,請注明出處:http://en.pswp.cn/news/445379.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

自然語言處理(1)-概述

自然語言處理-概述概述1.基本概念2.人類語言技術HLT發展簡史3.HLT 研究內容4.基本問題和主要困難5.基本研究方法概述 本系列文章計劃總結整理中國科學院大學宗成慶老師《自然語言處理》課程相關知識,參考數目《統計自然語言處理》-第二版,宗成慶。 1.基…

redis——客戶端

redis服務器是典型的一對多服務器,通過使用由IO多路復用技術實現的文件事件處理器,redis服務器使用了單線程單進程的方式來處理請求。 客戶端的屬性 描述符 客戶端狀態的 fd 屬性記錄了客戶端正在使用的套接字描述符: typedef struct red…

矩陣論-線性空間的基與坐標,基變換坐標變換

線性空間與線性變換綜述1.1 線性空間1.1.3 線性空間的基與坐標1.1.4 基變換與坐標變換綜述 本系列博文主要總結學習矩陣論的心得筆記,參考數目《矩陣論》–張凱院;整個文章的整理體系參照行書過程。 1.1 線性空間 1.1.3 線性空間的基與坐標 向量的坐…

大數據學習(2-1)-Hadoop安裝教程-單機模式和偽分布模式(Ubuntu14.04LTS)

文章目錄目錄1.linxu的安裝1.1安裝Linux虛擬機1.2安裝Linux和Windows雙系統2.Hadoop的安裝2.1 Hadoop安裝前配置2.1.1 配置Hadoop用戶2.1.2 安裝 ssh , 配置ssh免密登錄2.1.3 安裝java環境2.2 Hadoop的安裝3.Hadoop單機版配置4.Hadoop偽分布版配置目錄 1.linxu的安裝 1.1安裝…

mysql——JDBC

概述 JDBC:java Data Base Connectivity ,java數據庫連接,它是一種用于執行sql語句的java API,為多種關系數據庫提供統一訪問。 其實就是一組用java編寫的類和接口。 JDBC API 提供兩類主要接口: 1)面向開發人員的…

數組精選題目三連(6)

題目一:調整有序的arr數組,使得左半部分有序且不重復,不用保證右邊是否有序。 思路: u : 左邊的最后位置,即0---u為答案 i : 從u到右遍歷 當arr[i]和arr[u]不相等時&#…

大數據學習(2-2)- 使用docker安裝配置Hadoop環境

我的思路是這樣:安裝ubuntu系統---->下載docker---->在docker里拉取hadoop鏡像---->在此鏡像里創建三個容器(Master、Slave1、Slave2)---->完成完全分布式 1. 安裝ubuntu系統(無論你是安裝的單系統,還是用虛擬機安裝了ubuntu) 如果想安裝單…

自然語言處理(2)-信息論基礎

自然語言處理-數學基礎概述1.信息論基礎1.1熵1.2 聯合熵和條件熵1.3 相對熵和交叉熵1.4 互信息和雙字耦合度1.5 噪聲信道模型概述 本系列文章計劃總結整理中國科學院大學宗成慶老師《自然語言處理》課程相關知識,參考數目《統計自然語言處理》-第二版,宗…

servlet基礎總結

什么是servlet Servlet(Server Applet)是Java Servlet的簡稱,是小服務程序或服務連接器,是用Java編寫的服務器端程序,主要功能在于交互式地瀏覽和修改數據,生成動態Web內容. 狹義的Servlet是指Java語言實…

大數據學習(3)- 分布式文件系統HDFS

文章目錄目錄1.分布式文件系統1.1 計算機集群概念1.2 分布式文件系統結構2.HDFS簡介2.1 HDFS設計的目標2.2HDFS的局限性2.3 塊的概念2.4 HDFS主要組件及其功能2.4.1 名稱節點2.4.2 第二名稱節點2.4.3 數據節點3.HDFS體系結構3.1 HDFS體系結構介紹3.2 HDFS體系結構的局限性4.HDF…

Python 圖片轉簡單字符畫

字符畫是一系列字符的組合,我們可以把字符看作是比較大塊的像素,一個字符能表現一種顏色(暫且這么理解吧),字符的種類越多,可以表現的顏色也越多,圖片也會更有層次感。 灰度值:指黑…

大數據學習(4)--分布式數據庫HBase

文章目錄目錄1.HBase概述1.1BigTable1.2 HBase簡介1.3 HBase和傳統的關系型數據庫之間的區別2.HBase訪問接口3.HBase數據模型3.1 數據模型概述3.2 數據模型相關概念3.3 數據坐標3.4 概念視圖3.5 物理視圖3.6 面向列的存儲4.HBase的實現原理4.1 HBase功能組件4.2 表和region4.3 …

servlet中的數據存儲

在servlet基礎中,我們: 用以下幾種方式實現數據存儲和共享: 1)在客戶端頁面和服務器端程序之間,用request中的getParameter()方法共享數據 2)在請求和請求之間,可以用get/setAttribute方法來共…

Linux(2)-tar,find,grep,xargs

常用命令1. 打包壓縮/解包解壓縮 tar1.1 打包 tar -czvf xxx.tar.gz xxx1.2 解壓 tar -xzvf xxx.tar.gz2.文件/目錄搜索2.1 find文件/目錄查找2.2 grep文本匹配3. 復合命令3.1 > 重定向3.2 | 管道.shutdown1. 打包壓縮/解包解壓縮 tar tar和gzip是對黃金搭檔:ta…

Event Recommendation Engine Challenge(基礎版)---代碼

第一步:統計user和event相關信息 #查看train_csv的數據 import pandas as pd df_train pd.read_csv(train.csv) df_train.head()usereventinvitedtimestampinterestednot_interested03044012191877122502012-10-02 15:53:05.75400000:000013044012150228424802012…

servlet——三兄弟的另外兩個:過濾器/監聽器

過濾器 我們寫多了servlet會發現,很多代碼和功能是重復的,比如:解決中文亂碼問題、權限驗證、日志的記錄等,他們的特點是:代碼相同或相似、分散在不同位置、不利于維護。 過濾器就是他們的解決辦法。 過濾器是請求到…

矩陣論-線性變換的特征值與特征變換

線性空間與線性變換綜述1.2 線性變換及其矩陣1.2.3 特征值與特征向量綜述 本系列博文主要總結學習矩陣論的心得筆記,參考數目《矩陣論》–張凱院;整個文章的整理體系參照行書過程。 1.2 線性變換及其矩陣 1.2.3 特征值與特征向量 本節討論如何選擇線…