Redis 事件 2 時間事件

2021-07-03 18:38:52 字數 1451 閱讀 2559

redis時間事件分為以下兩類:

1.定時事件:程式在指定時間執行一次。

2.週期性事件:程式每隔指定時間執行一次。

時間事件的屬性:

1.id:伺服器為時間事件建立的全域性唯一id,id號從小到大遞增。

2.when:毫秒精度的unix時間戳,記錄時間事件的到達時間。

3.timeproc:時間事件處理器,乙個函式。當時間事件到達事,執行此函式。

時間事件的返回值決定了時間事件型別,如返回ae.h/ae_nomore,表示事件為定時事件,到達一次後則刪除;如返回乙個非ae_nomore的整數,表示事件為週期性事件,當事件到達之後,伺服器會根據返回值更新時間事件的when屬性,並以這種方式一直更新下去。當前redis版本中只有週期性事件,沒有使用定時事件。

實現:伺服器將所有時間事件都存放在乙個無序列表中,每當時間事件執行器執行時,它就遍歷整個鍊錶,找到所有已到達的時間事件並呼叫相應事件處理器。這裡的的無序鍊錶,指的是不按when屬性大小排序,其實是按id排序了,新的時間事件總是插入鍊錶的表頭。當前redis版本中,伺服器只使用servercron乙個時間事件,而在benchmark模式下,伺服器也只使用2個時間事件,所以使用無序鍊錶來儲存時間事情,並不影響效能。

servercron函式:

此函式定期對redis服務的資源和狀態進行檢查和調整,由redis.c/servercron執行,工作包括:

1.更新伺服器各類統計資訊,如時間、記憶體占用、資料庫占用等等。

2.清理資料庫中的過期鍵值對。

3.關閉和清理連線失效的客戶端。

4.嘗試進行aof和rdb持久化操作。

5.如果當前伺服器是主伺服器,需要對從伺服器進行定期同步。

6.如果出於集群環境,需要對集群進行定期同步和連線測試。

事件排程偽**:

def aeprocessevents():

#獲取到達時間離當前時間最接近的時間事件

time_event = aesearchnearesttimer()

#計算最接近的時間事件距離到達還有多少毫秒

remain_ms = time_event.when - unix_ts_now()

#如果事件已到達,那麼remain_ms 值可能為負數,置為0

if remain_ms < 0:

remain_ms = 0

#根據remain_ms值,建立timeval結構

timeval = create_timeval_with_ms(remain_ms)

#阻塞並等待檔案事件產生,最大阻塞時間由傳入的timeval結構決定

#如果remaind_ms值為0,那麼aeapipoll呼叫之後馬上返回,不阻塞

aeapipoll(timeval)

#處理所有已產生的檔案事件

processfileevents()

#處理所有已到達的時間事件

processtimeevents()

5時間物件和鍵盤事件物件

當行為觸發的時候執行對應的繫結方法,而且瀏覽器還給對應的方法傳遞了乙個引數值 事件物件 1 mouseevent 滑鼠事件物件 記錄當前本次操作滑鼠相關資訊的乙個物件 物件中有很多的屬性名和屬性值記錄了滑鼠的相關資訊 mouseevent這個類的乙個例項 e instanceof mouseeven...

Redis設實 13 事件 下 時間事件

redis設計與實現 黃建巨集 著 第11章 該書基於redis2.9,即redis3.0開發版編寫 分2類 定時事件 指定時間後執行一次 事件處理器返回ae nomore,該事件達到一次後被刪除 週期事件 每隔指定時間執行一次 事件處理器返回非ae nomore整數值,根據該值更新when屬性,讓...

Redis 事件監聽

需求 要統計乙個頁面的訪問人數,如果訪問量大時,頻繁讀寫資料庫,而且操作的是同乙個資料,可能會對效能造成影響。解決 把資料放在快取中,定期和資料庫同步,設定容器關閉 關閉容器前,將資料同步到資料庫。現在系統中快取用的是redis。redis一般的應用是提供查詢效率,很少更新,更新也是直接更新資料庫,...