mysql 异步api_Hiredis异步API
異步API Hiredis 擁有一個套異步API方便與一些事件庫協同工作. Hiredis的代碼中涵蓋了hiredis與libev和libevent這兩個庫結合使用的例子. 連接 函數 redisAsyncConnect 用來建立到redis服務器的非阻塞連接. 返回一個 redisAsyncContext 結構體指針. 因為建立
異步API
Hiredis 擁有一個套異步API方便與一些事件庫協同工作.
Hiredis的代碼中涵蓋了hiredis與libev和libevent這兩個庫結合使用的例子.
連接
函數 redisAsyncConnect 用來建立到redis服務器的非阻塞連接.
返回一個 redisAsyncContext 結構體指針. 因為建立的連接是非阻塞的,無法立即返回目標主機的ip和端口是否可達。所以在建立連接后,我們應該檢查 err 成員,來確認連接是否存在錯誤。
redisAsyncContext *c = redisAsyncConnect("127.0.0.1", 6379);
if (c->err) {
printf("Error: %s\n", c->errstr);
// 錯誤處理
}
redisAsyncContext包含一個連接斷開回調函數(主動斷開,或者發生錯誤都會調用)。此函數原型如下:
void(const redisAsyncContext *c, int status);
當用戶主動斷開連接時, 參數 status 被設置為 REDIS_OK ;
當發生錯誤而導致連接斷開時 status 被設置為REDIS_ERR 。此時我們可以根據 err 成員變量判斷錯誤產生的情況。
當我們需要進行斷線重連時,可以在斷開連接回調函數處理。
每個上下文(redisAsyncContext)實例只能設置一次斷線回調函數,多次調用會返回REDIS_ERR錯誤。
使用以下函數設置斷線回調函數:
int redisAsyncSetDisconnectCallback(redisAsyncContext *ac, redisDisconnectCallback *fn);
發送命令并設置回調
使用redisAsyncContext時,(每幀)發送的命令會自動pipelined(打包發送命令)。所以我們需要設置reply回調函數來進行命令執行后的處理工作。回調函數原型如下:
void(redisAsyncContext *c, void *reply, void *privdata);
參數 privdata 為用戶數據,你可以設置成函數調用時所需要的任意數據。
使用以下函數發送異步命令:
int redisAsyncCommand(
redisAsyncContext *ac, redisCallbackFn *fn, void *privdata,
const char *format, ...);
int redisAsyncCommandArgv(
redisAsyncContext *ac, redisCallbackFn *fn, void *privdata,
int argc, const char **argv, const size_t *argvlen);
這兩個函數和阻塞版本類似。命令成功添加到輸出緩沖區時返回 REDIS_OK ,錯誤時返回 REDIS_ERR 。
例如:當連接被用戶中斷時,新命令無法被添加,所有類似 redisAsyncCommand 的函數調用都返回 REDIS_ERR錯誤碼。
如果將回調函數設置成 NULL (? privdata,還是reply?需要實驗一下
?)內存被立即釋放。當回調函數非空,則內存在調用后釋放內存。reply參數只能在回調函數體中使用。
當上下文(redisAsyncContext)發生錯誤時所有未執行的命令所設置的回調函數都會被調用,回調函數中reply指針為空。
斷開連接
異步連接可以使用以下函數終止:
void redisAsyncDisconnect(redisAsyncContext *ac);
當函數被調用時連接并不是立即被斷開,而是新的命令不在被接受。(調用函數后)當所有未執行的指令都被寫入到socket中,并且命令回調函數都被執行以后,連接才被中斷(連接中斷回調函數被調用,status為 REDIS_OK )、上下文對象被釋放。.
綁定到事件庫
There are a few hooks that need to be set on the context object after it is created. See the adapters/ directory
for bindings to libev and libevent.
本文原創發布php中文網,轉載請注明出處,感謝您的尊重!
總結
以上是生活随笔為你收集整理的mysql 异步api_Hiredis异步API的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 女人个性签名感悟
- 下一篇: flume写入mysql_Flume高级