redis集羣帶密碼驗證的hiredis客戶端

之前一直都是使用單機部署的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<stdio.h>
//#include<hircluster.h>
#include<rediscluster.h>

//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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章