用hiredis client 测试了下brpop,这是hadoop提取数据后通过消息队列传输数据。
这个是基于libevent的client
.h
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <hiredis.h>
#include <async.h>
#include <adapters/libevent.h>
struct event_base *base;
void connectCallback(const redisAsyncContext *c, int status);
void disconnectCallback(const redisAsyncContext *c, int status);
void getCallback(redisAsyncContext *c, void *r, void *privdata);
void getcb(redisAsyncContext *c,void *r,void *privdata){
redisReply *reply = r;
if (reply == NULL) return;
if(strcmp((char*)privdata,"get") == 0)
{
printf("get get call back a: %s\n",reply->str);
}
}
void pubCallback(redisAsyncContext *c, void *r, void *privdata) {
redisReply *reply = r;
if (reply == NULL) return;
/*if(strcmp((char*)privdata , "pub") == 0)
{
printf("publish call back .. create a subscribe to get publish.......\n");
//redisAsyncCommand(c,getcb,"get","get a");
redisAsyncContext *csub = redisAsyncConnect("127.0.0.1", 6379);
if (csub->err) {
// Let *c leak for now... //
printf("Error: %s\n", csub->errstr);
return;
}
redisLibeventAttach(csub,base);
redisAsyncSetConnectCallback(csub,connectCallback);
redisAsyncSetDisconnectCallback(csub,disconnectCallback);
redisAsyncCommand(csub,getCallback,c,"subscribe foo");
//redisAsyncDisconnect(c);
}*/
}
void getCallback(redisAsyncContext *c, void *r, void *privdata) {
redisReply *reply = r;
if (reply == NULL) return;
if(reply->type == REDIS_REPLY_ARRAY)
{
if(strcmp(reply->element[0]->str,"subscribe") == 0)
printf("%s with %s\n",reply->element[0]->str,reply->element[1]->str);
else if(reply->elements == 3)
{
printf("%s:get %s from %s\n",reply->element[0]->str,reply->element[1]->str,
reply->element[2]->str);
}else
printf("%s %s\n",reply->element[0]->str,reply->element[1]->str);
//redisAsyncCommand((redisAsyncContext *)privdata,getcb,"get","hgetall class1");
redisAsyncCommand(c,getCallback,"end-1","brpop UrlList 0");
}
else
printf("other message.\n");
//printf("argv[%s]: %s\n", (char*)privdata, reply->element[0]->str);
/* Disconnect after receiving the reply to GET */
//redisAsyncDisconnect(c);
}
void connectCallback(const redisAsyncContext *c, int status) {
if (status != REDIS_OK) {
printf("Error: %s\n", c->errstr);
return;
}
printf("Connected...\n");
}
void disconnectCallback(const redisAsyncContext *c, int status) {
if (status != REDIS_OK) {
printf("Error: %s\n", c->errstr);
return;
}
printf("Disconnected...\n");
}
int main (int argc, char **argv) {
signal(SIGPIPE, SIG_IGN);
base = event_base_new();
/*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);
redisAsyncSetConnectCallback(c,connectCallback);
redisAsyncSetDisconnectCallback(c,disconnectCallback);*/
redisAsyncContext *c2 = redisAsyncConnect("127.0.0.1", 6379);
if (c2->err) {
/* Let *c leak for now... */
printf("Error: %s\n", c2->errstr);
return 1;
}
redisLibeventAttach(c2,base);
redisAsyncSetConnectCallback(c2,connectCallback);
redisAsyncSetDisconnectCallback(c2,disconnectCallback);
//redisAsyncCommand(c, NULL, NULL, "SET key %b", argv[argc-1], strlen(argv[argc-1]));
//redisAsyncCommand(c, getCallback, (char*)"end-1", "GET key");
//redisAsyncCommand(c,getCallback,(char*)"sub","subscribe foo");
//redisAsyncCommand(c2,pubCallback,(char*)"pub","publish foo2 pb");
redisAsyncCommand(c2,NULL,NULL,"select 1");
redisAsyncCommand(c2,getCallback,(char*)"end-1","brpop UrlList 0");
event_base_dispatch(base);
return 0;
}
makefile
src=example-libevent.c
libs= -levent -lhiredis
INC= -I/usr/local/include/hiredis
GCC=gcc
target=subscript.out
target:$(target)
$(target):$(src)
$(GCC) $(src) $(libs) $(INC) -g -o $(target)
clean:
rm -f *.out
用redis-cli测试
127.0.0.1:6379[1]> lpush UrlList a
(integer) 1
127.0.0.1:6379[1]> lpush UrlList b
(integer) 1
127.0.0.1:6379[1]> lpush UrlList c
(integer) 1
127.0.0.1:6379[1]> llen UrlList
(integer) 0
127.0.0.1:6379[1]>
程序结果
[penggl@localhost examples]$ ./subscript.out
Connected...
UrlList a
UrlList b
UrlList c
好了,应用到项目上看看效果。