Redis的文件事件與時間事件處理

目錄

  • 文件事件處理
    • 事件類型
    • 客戶端和服務端的通信過程
  • 時間事件處理
    • 執行器執行
    • 周期性事件作用
  • 事件的調度與執行

文件事件處理

Redis基于Reactor模式開發了文件事件處理器。文件事件處理器以單線程方式運行,通過IO多路復用程序監聽多個套接字,實現了高性能網絡通信模型,又可以很好的與Redis服務器中同樣以單線程運行的模塊進行對接,保證了設計的簡單性。
文件事件處理器的構成:套接字、I/O多路復用程序、文件事件分派器、事件處理器請添加圖片描述

每當一個套接字準備好執行連接應答、寫入、讀取、關閉操作時就會產生一個文件事件。一個服務器通常會連接多個套接字,所以多個文件事件有可能并發出現。
I/O多路復用程序負責監聽多個套接字,并向文件事件分派器傳送產生了事件的套接字。
I/O復用程序總是將所有產生事件的套接字放在一個隊列里,通過這個隊列以有序、同步、每次一個套接字的方式向文件事件分派器傳送套接字。

事件類型

  • 當套接字可讀(客戶端對套接字執行write操作,或者執行close操作),或者有新的可應答套接字出現(客戶端對服務器的監聽套接字執行connect操作),套接字產生AE_READABLE事件
  • 當套接字可寫(客戶端對套接字執行read操作),套接字產生AE_WRITABLE
    如果一個套接字同時產生了這兩種事件,那么事件分派器會優先處理讀套接字,后處理寫套接字。

客戶端和服務端的通信過程

在這里插入圖片描述

時間事件處理

一個時間事件主要由三個屬性組成:
1、id:全局唯一id,新事件的id比老事件的id大
2、when:記錄時間事件的到達時間(ms級別)
3、timeProc:時間時間處理器,表示事件到達,服務器會調用相應的函數
時間事件分為定時事件與周期性事件,區別在于定時事件在到達一次之后就會被刪除,之后不再到達。而周期性事件在到達一次之后會對when屬性更新值,表示在一段時間后再次到達。
Redis的實現原理是將所有的時間事件放在一個無序鏈表中,每當時間事件執行器運作,遍歷鏈表,查找所有已達到時間時間,并調用相應的事件處理器。新的時間時間總是插入鏈表頭部,所以往往是按照ID逆序排列的,這里無序表示不按照when屬性大小排序。
由于時間事件個數較少,所以無序鏈表并不影響時間事件處理器的性能。

執行器執行

執行器具體執行步驟如下:

遍歷服務器中的所有時間事件
for (time_event : list)
{檢查該事件是否已經到達if (time_event <= now_time) {已到達,執行事件處理器,獲取返回值retval = time_event.timeProc()如果是一個定時事件,將事件從服務器中刪除if (retval == AE_NOMORE) delete_time_event(time_event)else否則更新when,讓該事件在指定時間后再次到達update_when(time_event, retval )}
}

周期性事件作用

Redis服務器需要定期對自身的資源和狀態進行檢查和調整,此時就會用到serverCron函數,該函數就是以周期性事件觸發的。默認是每秒運行10次。
主要作用為:
1、更新服務器各類統計信息,如時間、內存占用、數據庫占用情況
2、清理數據庫中過期鍵值對
3、關閉和清理連接失效的客戶端
4、嘗試進行AOF或RDB持久化操作
5、如果是主服務器還需要對從服務器定期同步
6、如果處于集群模式,還需要對集群定期同步和連接測試

事件的調度與執行

文件事件與時間事件之間是合作關系,服務器會輪流處理兩種事件,并且處理的過程中也不會進行在·搶占,所以時間時間的實際處理時間通常回避設定到達時間晚一些。
事件處理角度下的服務器運行流程:
在這里插入圖片描述
需要注意的點:
1、為了避免服務器對時間時間進行頻繁輪詢(忙等待),也為了避免阻塞過長時間,每次最大阻塞時間由到達時間最接近當前時間的時間事件決定。
2、文件事件是隨機出現的,所以等處理完一個文件事件之后如果還沒有時間事件到達,則服務器再次等待并處理文件事件,隨著文件事件不斷執行,逐漸接近時間事件設置的到達時間。
3、由于文件處理時同步、有序、原子執行,所以服務器不會中斷事件處理,也不會對事件進行搶占。所以不管是那種事件的處理都需要盡可能減少程序阻塞時間。將耗時的操作放到子線程或者子進程中處理

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

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

相關文章

fisher-yates_使用Fisher-Yates隨機播放算法以O(n)時間隨機播放給定數組

fisher-yatesExample: 例&#xff1a; Say the input array is [1, 2 3, 4, 5 6, 7]After reshuffling it can be anything like[4, 3, 7, 2, 1, 5, 1]Our goal is that the reshuffling should be as random as possible. 我們的目標是&#xff0c;改組應盡可能地隨機。 The…

[分享]一些在 WPF/Silverlight 中應用 MVVM 模式時可能會有點用途的代碼

想來這個博客也已經有很久沒更新過了&#xff0c;新年新氣象&#xff0c;現在就開始寫新內容吧。 最初的起因 在最近的幾個月中我做的開發總是要跟 XAML 打交道&#xff0c;也就是 WPF 啊&#xff0c;Silverlight 啊&#xff0c;WF 啊這些。 在進行 WPF 和 Silverlight 開發的…

手機調用系統的拍照和裁剪功能,假設界面有輸入框EditText,在一些手機會出現點擊EditText會彈出輸入法,卻不能輸入的情況。...

1、拍照裁剪后 點擊EditText會彈出輸入法&#xff0c;卻不能輸入。可是點擊點一EdtiText就能夠輸入了&#xff0c;所以我就寫了一個看不見的EdtiText&#xff0c;切換焦點&#xff0c;這樣就攻克了這個奇怪的這問題&#xff0c;應該是android內部的問題。 這是網絡一個牛人留下…

Redis一個命令請求從發送到完成的步驟以及初始化服務器步驟

一個命令請求從發送到完成的步驟 如下&#xff1a; 1、客戶端將命令請求發送給服務器 當用戶在客戶端中鍵入一個命令請求時&#xff0c;客戶端會將這個命令請求轉換成協議格式&#xff0c;然后通過連接到服務器的套接字&#xff0c;將協議格式的命令請求發送給服務器。 2、服…

c打印行號和函數_使用C中的函數名稱,行號從任何函數打印錯誤消息

c打印行號和函數Sometimes, it is necessary to print some message on logic failure or anytime with the function name and line number, so that program can be debugged and fixed the issue. 有時&#xff0c;有必要在邏輯故障時或在任何時候使用功能名稱和行??號打印…

Linux SPI框架

水平有限&#xff0c;描述不當之處還請指出&#xff0c;轉載請注明出處http://blog.csdn.net/vanbreaker/article/details/7733476 Linux的SPI子系統采用主機驅動和外設驅動分離的思想&#xff0c;首先主機SPI控制器是一種平臺設備&#xff0c;因此它以platform的方式注冊進內…

dbms標識符無效_DBMS中的嵌套查詢,相關的嵌套查詢和集合比較運算符

dbms標識符無效嵌套查詢 (Nested Queries) A query embedded in a query. This type of relation is termed as Nested Query and the Embedded Query is termed as a subquery. 查詢中嵌入的查詢。 這種類型的關系稱為嵌套查詢&#xff0c;而嵌入式查詢稱為子查詢。 For exam…

重構——解決過長參數列表(long parameter list)

目錄1、Replace Param with Query2、Preserve Whole Object3、Introduce Param Object4、Remove Flag Argument5、Combine Functions into ClassReference當我們需要在超長函數中提煉子函數時&#xff0c;如果函數內有大量的參數和臨時變量&#xff0c;這將會對函數的提煉形成很…

C# 點點滴滴: out和ref

用c#很長一段時間了&#xff0c;不過基本是啥都不會&#xff0c;當C用的&#xff0c;作為寫單片機的&#xff0c;還是真心覺得C比較親切&#xff0c;呵呵。 不過總是要進步啊&#xff0c;慢慢積累唄&#xff0c;這次是寫一個CAN的上位機模板出來&#xff0c;以后的項目就要徹底…

css控制圖片最寬 最高值

.content img{width:expression_r(this.width > 500 && this.height < this.width ? 500:true);max-width:500px;height:expression_r(this.height >500 ? 500:true);max-height:500px; }轉載于:https://www.cnblogs.com/panlin/archive/2013/01/06/2848017…

踩踩踩

http://china.findlaw.cn/laodongfa/ctjg/cy/cybc/ 二、合法裁員經濟補償標準的計算 按照《勞動合同法》第四十七條規定&#xff0c;經濟補償按勞動者在本單位工作的年限&#xff0c;每滿一年支付一個月工資的標準向勞動者支付。六個月以上不滿一年的&#xff0c;按一年計算;不…

c# 字節十六進制轉十進制_用C中的十進制,八進制和十六進制數字初始化字節數組...

c# 字節十六進制轉十進制C中的字節數組 (byte array in C) In C programming language, an unsigned char type can be used to declare byte array in C programming language. An unsigned char can contain a value from 0 to 255, which is the value of a byte. 在C編程語…

從uptime、stress、mpstat、pidstat觀察CPU密集型、IO密集型、進程密集型切換的系統性能

uptime dyydyy-Lenovo-ThinkBook-14-IIL:~$ uptime10:27:10 up 7 min, 1 user, load average: 1.32, 0.99, 0.49結果分別對應&#xff1a;當前時間、系統運行時間、當前用戶數目、過去 1 分鐘、5 分鐘、15 分鐘的平均負載(Load Average) 平均負載是指單位時間內&#xff0c…

解析和創建xml

http://www.cnblogs.com/Li-Cheng/p/3610474.html 轉載于:https://www.cnblogs.com/mxw272618/p/3769900.html

python - VirtualEnv virtualenvwrapper

VirtualEnv 是什么 VirtualEnv用于在一臺機器上創建多個獨立的python運行環境&#xff0c;VirtualEnvWrapper為前者提供了一些便利的命令行上的封裝。 為什么要用 - 隔離項目之間的第三方包依賴&#xff0c;如A項目依賴django1.2.5&#xff0c;B項目依賴django1.3。- 為部署應用…

多臺計算機共享內存_共享內存多處理器和指令執行| 計算機架構

多臺計算機共享內存共享內存多處理器 (Shared Memory Multiprocessor) There are three types of shared memory multiprocessor: 共有三種類型的共享內存多處理器&#xff1a; UMA (Uniform Memory Access) UMA(統一內存訪問) NUMA (Non- uniform Memory Access) NUMA(非統一…

htop與atop

htop htop使用詳解–史上最強 atop Linux atop監控工具部署

js未看的文章

Web前端研發工程師編程能力飛升之路 在瀏覽器的背后&#xff08;一&#xff09; —— HTML語言的詞法解析 組件化的前端開發流程 用js書寫UI組件之js基礎知識 GC與JS內存泄漏 藍色理想之前端開發 w3c JavaScript Puzzlers react AngularJS入門教程 jQuery源碼分析-如何做jQuery…

方法重寫,隱藏在子類父類中的各種調用實踐

一.子類和父類方法之間的關系 1.當子類和父類有方法完全相同的方法 namespace ConsoleApplication2 {class Program{static void Main(string[] args){B b new B();A a new A();A c new B();b.Show();a.Show();c.Show();Console.Read();}}public class A{public void Show()…

向量余弦值python_向量/矩陣的余弦值打印(元素明智的操作) 使用Python的線性代數

向量余弦值pythonPrerequisite: 先決條件&#xff1a; Defining a Vector 定義向量 Defining a Matrix 定義矩陣 Numpy is the library of function that helps to construct or manipulate matrices and vectors. The function numpy.cos(x) is a function used for generati…