亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

redis文件事件和時間事件是什么

發布時間:2022-03-09 09:06:24 來源:億速云 閱讀:118 作者:iii 欄目:關系型數據庫

今天小編給大家分享一下redis文件事件和時間事件是什么的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

redis文件事件和時間事件是什么

Redis在6.0以前是單線程的,在6.0之后可以通過配置文件開啟多線程,6.0之后的多線程是指在io方面使用多線程來執行以加快I/O的速度。

Redis服務器是一個事件驅動程序,服務器需要處理以下兩類事件:

  • 文件事件(file event)
    Redis服務器通過套接字與客戶端(或者其他Redis服務器)進行連接,而文件事件就是服務器對套接字操作的抽象。服務器與客戶端(或者其他服務器)的通信會產生相應的文件事件,而服務器則通過監聽并處理這些事件來完成一系列網絡通信操作。文件事件處理器使用I/O多路復用(multiplexing)程序來同時監聽多個套接字,并根據套接字目前執行的任務來為套接字關聯不同的事件處理器。當被監聽的套接字準備好執行連接應答(accept)、讀取(read)、寫入(write)、關閉(close)等操作時,與操作相對應的文件事件就會產生,這時文件事件處理器就會調用套接字之前關聯好的事件處理器來處理這些事件。

  • 時間事件(time event)
    Redis服務器中的一些操作(比如serverCron函數)需要在給定的時間點執行,而時間事件就是服務器對這類定時操作的抽象。時間事件分兩類第一類是定時事件(讓一段程序在指定的時間之后執行一次)另一類是周期性事件(讓一段程序每隔指定時間就執行一次)。

一、文件事件

1、文件事件處理器

文件事件處理器是由四部分組成的分別是套接字、I/O多路復用程序、文件事件分派器、事件處理器。
redis文件事件和時間事件是什么
I/O多路復用程序負責監聽多個套接字,并向文件事件分派器傳送那些產生了事件的套接字。盡管多個文件事件可能會并發的出現,單I/O多路復用程序總是會將所有產的事件的套接字都放到一個隊列里面,然后通過這個隊列,以有序的、同步的、每次一個套接字的方式向文件事件分派傳送套接字。當上一個套接字產生的事件被處理完畢之后(該套接字所關聯的事件處理執行完畢),I/O多路復用程序才會繼續向文件事件分派器傳送下一個套接字,文件事件分派器接收I/O多路復用程序傳來的套接字,并根據套接字產生的事件的類型條用相應的事件處理器,服務器會執行不同人物的套接字關聯不同的事件處理器,這些處理器定義了某個事件發生時服務器該執行的動作。

2、I/O多路復用

Redis的多路復用程序的所有功能都是通過包裝select、epoll、evport、kqueue這些I/O多路復用函數庫來實現的

3、文件事件類型
  • AE_READABLE事件
    當套接字變得可讀時(客戶端執行write或者close操作)或者有新的可應答的套接字出現時套接字將會產生AE_READABLE事件。

  • AE_WAITABLE事件
    當套接字變得可寫時(客戶端執行read操作)將產生AE_WAITABLE事件
    I/O多路復用程序會同時監聽AE_READABLE事件和AE_WAITABLE事件,如果一個套接字同時產生了這兩種事件,那么事件分派器會優先處理AE_READABLE事件,也即是說服務器將先讀套接字后寫套接字。

4、文件事件的處理器
  • 連接應答處理器
    連接應答處理器,這個處理器用于對連接服務器監聽套接字的客戶端進行應答,當Redis服務器進行初始化的時候,程序會將這個連接應答處理器和服務器監聽套接字的AE_READABLE事件關聯起來,當客戶端連接服務器監聽套接字的時候,套接字就會產生AE_READABLE事件,引發連接應答處理器執行,并執行相應的套接字應答操作。

  • 命令請求處理器
    當一個客戶端通過連接應答處理器成功連接到服務器之后,服務端會將套接字的AE_READABLE事件和命令請求處理器關聯起來,當客戶端向服務端發送命令請求的時候,套接字就會產生AE_READABLE事件,引發命令請求處理器執行,并執行套接字讀入等操作。在客戶端連接服務器的整個過程中,服務器都會一直為客戶端套接字的AE_READABEL事件關聯命令請求處理器。

  • 命令回復處理器
    當服務器有命令回復需要傳送給客戶端的時候,服務器會將客戶端套接字的AE_WRITABLE事件和命令回復處理器關聯起來,當客戶端準備好接收服務器回傳的命令回復時,就會產生AE_WAITABEL事件,引發命令回復處理器執行,并執行相應的套接字寫操作。當命令回復發送完畢之后,服務器就會解除命令回復處理器與客戶端套接字的AE_WAITABLE事件之間的關聯。

5、一次完成的客戶端與服務器連接事件實例

首先Redis客戶端向服務器發起連接,那么監聽套接字將產生AE_READABEL事件,觸發連接應答處理器執行,處理器會對客戶端的連接請求進行應答,然后創建客戶端套接字,以及客戶端狀態,并將客戶端套接字的AE_READABEL事件與命令請求處理器進行關聯,使得客戶端可以向主服務器發送命令請求。

之后假設客戶端向主服務器發送一個命令請求,那么客戶端套接字將產生AE_READABEL事件,引發命令請求處理器執行,處理器讀取客戶端的命令,然后傳給相關聯的程序去執行。

執行命令將產生相應的命令回復,為了將這行命令回復傳送回給客戶端,服務器會將AE_WAITABLE事件和命令回復處理器進行關聯。當客戶端嘗試讀取命令回復的時候客戶端會產生AE_WAITABLE事件,觸發命令回復處理器執行,當命令回復處理器將命令回復全服寫入套接字之后,服務器就會解除客戶端套接字的AE_WAITABLE事件與命令回復處理器執行的關聯。

二、時間事件

1、時間事件的組成
  • id
    服務器為時間事件創建全局唯一ID。ID號從小到大順序遞增。

  • when
    毫秒精確度的UNIX時間戳,記錄了時間事件的到達時間。

  • timeProc
    時間事件處理器,一個函數。當時間事件到達時,服務器就會調用相應的處理器來處理事件。

一個時間事件是定時事件還是周期性事件取決于時間事件處理器的返回值,如果事件處理器返回ae.h/AE_NOMORE,那么這個事件為定時事件,該事件在到達一次后就會被刪除,之后不再到達。如果事件處理器返回一個非AE_NOMORE的整數值,那么這個事件為周期性事件,當一個時間事件達到后,服務器會根據事件處理器的返回值,對事件的when屬性進行更新,讓這個事件在一段時間后再次到達,并以這種方式一直更新并運行下去。

實現

服務器將所有時間事件都放在一個無序鏈表中(無序的并不是指id字段,而是when字段所以每次執行都要遍歷完真個鏈表。),每當時間事件執行器運行時,它就會遍歷整個鏈表,查找到所有已經到達的事件,并調用相應的事件處理器。
這里需要說明的是雖然是無序鏈表但是由于鏈表的長度不會很長正常模式下Redis服務器只使用serverCron一個時間事件所以這個地方機會退化成了指針的作用,而benchmark模式下,服務器也只使用兩個時間事件,所以全遍歷對性能影響可以忽略。

serverCron函數

持續運行的Redis服務器需要定期對自身的資源和狀態進行檢查和調整,從而確保服務器可以長期、穩定地運行,這些定期操作由redis.c/serverCron函數負責執行,它的主要工作包括:

  • 更新服務器的各類統計信息,比如時間、內存占用、數據庫占用等情況。

  • 清理數據庫中過期的鍵值對。

  • 關閉和清理連接失效的客戶端。

  • 嘗試進行AOF或者RDB持久化操作。

  • 如果服務器是主服務器,那么對從服務器進行定期同步

  • 如果處于集群模式,對集群進行定期同步和連接測試。

事件的調度與執行

因為服務器中同時存在文件事件和時間事件兩種事件類型,所以服務器必須對這兩種事件進行調度,決定何時應該處理文件事件,何時又應該處理時間事件,以及花多少時間來處理它們等等。
處理過程的偽代碼如下:

def aeProcessEvents():
	# 獲取到達時間離當前最近的時間事件
	tem_event = aeSearchNearestTimer()
	
	# 計算上一步獲得到的事件 距離到達還有多少秒
	remaind_ms = time_event.when - unix_ts_now()
	
	# 如果事件已經到達, 那么remaind_ms的值可能為負數,設置為0
	remaind_ms = max(remaind_ms, 0)
	
	# 阻塞并等待文件事件產生,最大阻塞時間由timeval結構決定,
	# 如果remaind_ms的值為0,那么aeAPiPoll調用之后馬上返回,不阻塞
	aeApiPoll(timeval)
	# 處理所有已經產生的文件事件
	processFileEvents()
	# 處理所有已經到達的時間事件
	proccessTimeEvents()

事件的調度和執行規則:
1)aeApiPoll函數的最大阻塞時間由到達時間最接近當前時間的時間事件決定,這個方法既可以避免服務器對時間事件進行頻繁的輪詢(忙等待),也可以確保aeApiPoll函數不會阻塞過長時間。

2)因為文件事件是隨機出現的,如果等待并處理完一次文件事件之后,仍未有任何時間事件到達,那么服務器將再次等待并處理文件事件。隨著文件事件的不斷執行,時間會逐漸向時間事件所設置的到達時間逼近,并最終來到到達時間,這時服務器就可以開始處理到達的時間事件了。

3)對文件事件和時間事件的處理都是同步、有序、原子地執行的,服務器不會中途中斷事件處理,也不會對事件進行搶占,因此,不管是文件事件的處理器,還是時間事件的處理器,它們都會盡可地減少程序的阻塞時間,并在有需要時主動讓出執行權,從而降低造成事件饑餓的可能性。比如說,在命令回復處理器將一個命令回復寫人到客戶端套接字時,如果寫人字節數超過了一個預設常量的話,命令回復處理器就會主動用break跳出寫入循環,將余下的數據留到下次再寫;另外,時間事件也會將非常耗時的持久化操作放到子線程或者子進程執行。

4)因為時間事件在文件事件之后執行,并且事件之間不會出現搶占,所以時間事件的實際處理時間,通常會比時間事件設定的到達時間稍晚一些。

文件事件和時間事件之間是合作關系,服務器會輪流處理這兩種事件,并且處理事件的過程中也不會進行搶占。時間事件的實際處理時間通常會比設定的到達時間晚一些。

以上就是“redis文件事件和時間事件是什么”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

临清市| 宣汉县| 大邑县| 安康市| 塔城市| 工布江达县| 敖汉旗| 康乐县| 南漳县| 高平市| 株洲县| 博客| 广饶县| 都江堰市| 讷河市| 平度市| 綦江县| 甘泉县| 甘洛县| 神池县| 保定市| 故城县| 临汾市| 土默特左旗| 松原市| 长春市| 同仁县| 阿拉尔市| 晋宁县| 扶沟县| 余姚市| 车险| 洱源县| 成武县| 乌海市| 西吉县| 枣阳市| 汶上县| 元阳县| 巴彦淖尔市| 凯里市|