redis的事件管理和定時器的管理都是自己來實現的,redis的事件管理分為兩部分,一部分是封裝了系統的非同步事件api,還有一部分是在這基礎上封裝了乙個通用的事件管理器,根據具體的系統來決定具體使用哪個非同步管理api。
先來說說redis支援哪些非同步的系統api。redis內部封裝了epoll,evport,kqueue,select這四個原始的事件管理器。
那epoll舉個例子解析一下吧。
1 typedef structaeapistate
2 aeapistate;
這個結構體封裝了乙個具體的事件例項。
封裝的介面函式:
1static
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...