之前一直都是使用单机部署的redis服务器,用着hiredis不亦乐乎,后来公司改为redis集群,突然发现之前的hiredis不能用了,赶紧查了一下资料,终于发现了hiredis也有Cluster模式,刚开始找到的是hiredis-vip,一看这个名字就很屌的样子,vip。看了一下介绍,原来是唯品会这厮弄的,”唯品会,一家专门做特卖的网站!“,我擦嘞,没想到这么多互联网巨头都没弄出来,让人家一个专门给女孩子卖衣服的网站给搞出来了,刷新了我对唯品会的新观。
https://github.com/vipshop/hiredis-vip
言归正传,赶紧clone下来,一下就编译过去了,啥依赖都没有。一看就是个好东西。正准备用上,突然发现一个问题,原来这货是不支持密码验证的,而公司的redis服务器都是带密码的。用了hiredis的方法去AUTH认证,一直报错:NOAUTH Authentication required .。这才发现这货不能进行密码认证,那不是白搞了。不能气馁,继续找找资料,在百度上找了好久也没找到关于hiredis-vip的密码认证的方法,没办法,只好去githua,这边的大神走在比较靠前。果然,找到了一个hiredis-v(Inherited from hiredis-vip, support redis cluster authenticate),一看到这个auth就知道这个人也意思到了这个问题,故将hiredis-vip改造成支持auth认证的,代码只改了一点点就实现了,看来唯品会的兄弟还是太着急了,估计被领导在催,既然这么明显的一个需求都没时间去实现。
https://github.com/wuli1999/hiredis-v
又一次满怀激动的开始了验证,hiredis-v就是在hiredis-vip的基础上,封装了带密码认证的接口,赶紧拿来用,编译通过,开始运行。
connect error : ERR This instance has cluster support disabled
这又是什么鬼,网上一查,原来是我的redis服务器不是集群部署的,原来如此,赶紧找一个集群部署的redis,终于。。。。成功了。哈哈,记录一下(感谢wuli1999)
//sync
#include
//#include
#include
//sync
int main()
{
int result;
redisReply* reply = NULL;
redisClusterContext *cc = redisClusterConnect("127.0.0.1:34501,127.0.0.1:34502,127.0.0.1:34503","pass",HIRCLUSTER_FLAG_NULL);
redisClusterContext *cc = redisClusterContextInit();
redisClusterSetOptionPassword(cc, "redis@pass");
redisClusterSetOptionAddNodes(cc, "192.168.50.79:8001,192.168.50.80:8001,192.168.50.81:8001");
redisClusterConnect2(cc);
if(cc == NULL || cc->err)
{
printf("connect error : %s\n", cc == NULL ? "NULL" : cc->errstr);
return -1;
}
printf("Connect to redisServer Success\n");
int i;
for(i=0; i<5; i++)
{
//set
reply = redisClusterCommand(cc, "set key%d value%d", i, i);
if(reply == NULL)
{
printf("set key%d, reply is NULL, error info: %s\n", i, cc->errstr);
redisClusterFree(cc);
return -1;
}
printf("set key%d, reply:%s\n", i, reply->str);
freeReplyObject(reply);
//get
reply = redisClusterCommand(cc, "get key%d", i);
if(reply == NULL)
{
printf("get key%d, reply is NULL, error info: %s\n", i, cc->errstr);
redisClusterFree(cc);
return -1;
}
printf("get key%d, reply:%s\n", i, reply->str);
freeReplyObject(reply);
}
redisClusterFree(cc);
return 0;
}