redis hiredis brpop

本文介绍了如何使用hiredis客户端进行Redis的brpop命令操作,该操作在处理Hadoop数据提取并经由消息队列传输时发挥作用。通过基于libevent的client实现高效的数据交互。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用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

好了,应用到项目上看看效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值