hredis提供了,非同步介面,而且可以結合libevent、libev等訊息架構使用;
範例程式碼(結合libevent使用,libevent參考):
test_asyn.c
#include<stdio.h>#include<stdlib.h>#include<string.h>#include<hiredis/hiredis.h>#include<hiredis/async.h>#include<hiredis/adapters/libevent.h>#include<event2/event.h>//設定get命令的回呼函數void getCallback(redisAsyncContext *c, void *r, void *privdata) { printf("in get cmd callback \n"); redisReply *reply = r; if (reply == NULL){ printf("reply == NULL"); return; } printf("get cmd:[%s], reply->str:%s\n", (char*)privdata, reply->str); // Disconnect redisAsyncDisconnect(c);}//設定串連回呼函數void connectCallback(const redisAsyncContext *c, int status) { if (status != REDIS_OK) { printf("in connectCallback Error: %s\n", c->errstr); return; } printf("Connected...\n");}//設定中斷連線回呼函數void disconnectCallback(const redisAsyncContext *c, int status) { if (status != REDIS_OK) { printf("in disconnectCallback Error: %s\n", c->errstr); return; } printf("Disconnected...\n");}int main (int argc, char **argv) { struct event_base *base = event_base_new();//建立一個libevent事件處理 redisAsyncContext *c = redisAsyncConnect("127.0.0.1", 6379);//建立非同步串連 if (c->err) { /* Let *c leak for now... */ printf("Error: %s\n", c->errstr); return 1; } redisLibeventAttach(c,base);//將串連添加到libevent事件處理 redisAsyncSetConnectCallback(c,connectCallback);//設定串連回調 redisAsyncSetDisconnectCallback(c,disconnectCallback);//設定中斷連線回調 redisAsyncCommand(c, NULL, NULL, "SET aaa %b", "bbb", sizeof("bbb"));//發送set命令 redisAsyncCommand(c, getCallback, (char*)"GET aaa", "GET aaa");//發送get命令 event_base_dispatch(base); //開始libevent迴圈。注意在這一步之前redis是不會進行串連的 return 0;}
Makefile
all:test_asyn.c gcc -o test_asyn test_asyn.c -I/mydir/local/include -I/mydir/include -L/mydir/local/lib -lhiredis -L/mydir/lib -levent
執行結果(需要先把/mydir/local/lib和/mydir/lib加入到LD_LIBRARY_PATH):
$ ./test_asyn Connected...in get cmd callback get cmd:[GET aaa], reply->str:bbbDisconnected...