Redis事件管理(三)

2022-04-30 19:42:12 字數 2243 閱讀 1607

redis的事件管理和定時器的管理都是自己來實現的,redis的事件管理分為兩部分,一部分是封裝了系統的非同步事件api,還有一部分是在這基礎上封裝了乙個通用的事件管理器,根據具體的系統來決定具體使用哪個非同步管理api。

先來說說redis支援哪些非同步的系統api。redis內部封裝了epoll,evport,kqueue,select這四個原始的事件管理器。

那epoll舉個例子解析一下吧。

1 typedef struct

aeapistate

2 aeapistate;

這個結構體封裝了乙個具體的事件例項。

封裝的介面函式:

1

static

int aeapicreate(aeeventloop *eventloop) //

建立乙個事件管理器

2static

int aeapiresize(aeeventloop *eventloop, int setsize) //

重置事件管理器管理事件的個數

3static

void aeapifree(aeeventloop *eventloop) //

刪除乙個事件管理器

4static

int aeapiaddevent(aeeventloop *eventloop, int fd, int mask)//

向事件管理器中新增乙個事件

5static

void aeapidelevent(aeeventloop *eventloop, int fd, int delmask) //

從時間管理器中刪除乙個事件

6static

int aeapipoll(aeeventloop *eventloop, struct timeval *tvp)//

啟用事件管理器,返回已經觸發的事件的個數

7static

char *aeapiname(void) //

獲取當前使用的是什麼事件模型

1 static int aeapicreate(aeeventloop *eventloop) //建立乙個事件管理器
1

/*建立成功返回0,否則返回-1*/2

static

int aeapicreate(aeeventloop *eventloop) 315

/*建立epoll描述符,如果建立失敗,記得把上面申請的記憶體釋放掉

*/16 state->epfd = epoll_create(1024); /*

1024 is just a hint for the kernel

*/17

if (state->epfd == -1

) 18

23 eventloop->apidata =state;

24return0;

25 }

2 static int aeapiresize(aeeventloop *eventloop, int setsize) //重置事件管理器管理事件的個數
/*

重置可接受事件的個數,這個函式不能直接呼叫,因為沒有檢查新size和舊size的大小關係,如果小了,直接重置會出問題

*/static

int aeapiresize(aeeventloop *eventloop, int

setsize)

4 static int aeapiaddevent(aeeventloop *eventloop, int fd, int mask)//向事件管理器中新增乙個事件
1

/*向epoll中增加事件,需要註冊新的檔案描述符和需要監控的事件型別*/2

static

int aeapiaddevent(aeeventloop *eventloop, int fd, int

mask)

3

6 static int aeapipoll(aeeventloop *eventloop, struct timeval *tvp)//啟用事件管理器,返回已經觸發的事件的個數
/*

獲取事件佇列

*/static

int aeapipoll(aeeventloop *eventloop, struct timeval *tvp)

}return

numevents;

}

Redis快取系列 三 redis記憶體管理

redis中,它的key的型別都是string,大小為512m 而value的型別的大小又不太相同 我們在啟動redis服務的時候,可以在它的配置檔案redis.conf中來配置它的最大記憶體閾值和達到閾值的執行策略,配置如下 最大記憶體控制 maxmemory 1gb 達到最大閾值的淘汰策略 下邊...

Redis 事件監聽

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

redis過期事件

背景 目前在 專案,訂單有過期邏輯,小夥伴提議用redis做,經討論分析,redis有key的過期事件,貌似可以實現,但是諮詢大神,好像不建議這樣用,可能會丟資料 隨便寫了段python 測試 1 import redis 23 r redis.redis host 127.0.0.1 port 6...