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:bbb
Disconnected...版权声明:本文为sbjiesbjie原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。