使用C/C++开发redis cluster集群(支持geo命令和TLS认证)

      最近项目要把收集到的地图上的点存储到redis中,然后使用geo命令处理,所以让我搞redis集群搭建,这个简单,网上都是,但是要用C++去连接集群而且支持geo命令和TLS认证,这就有点东西了,最后还是搞好了,记录一下。

1.安装hiredis

git clone https://github.com/redis/hiredis

cd hiredis

make USE_SSL=1

sudo make install

2.安装hiredis-cluster

git clone https://github.com/Nordix/hiredis-cluster.git

cd hiredis-cluster

mkdir build

cd build

cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo -DENABLE_SSL=ON ..

make

到这里原始的库不自带geo指令,需要我们自己添加,找到command.c和command.h,修改源码

 

 

 修改完成后重新make一下,这样库里就支持我们添加的geo指令了。

3.编写程序调用 ,增加TLS认证

#include "hiredis/hiredis_ssl.h"
#include "hiredis/hiredis.h"
#include "hiredis_cluster/hircluster_ssl.h"
#include "hiredis_cluster/hircluster.h"
#include <stdio.h>
#include <stdlib.h>

#define CLUSTER_NODE_TLS "127.0.0.1:6378,127.0.0.1:6379"
#define CLUSTER_PASSWORD "<PASSWORD>"

int main(int argc, char **argv) {
    UNUSED(argc);
    UNUSED(argv);

    redisSSLContext *ssl;
    redisSSLContextError ssl_error;

    redisInitOpenSSL();
    ssl = redisCreateSSLContext(NULL, "/etc/ssl/certs", NULL, NULL,
                                NULL, &ssl_error);
if (!ssl) {
        printf("SSL Context error: %s\n", redisSSLContextGetError(ssl_error));
        exit(1);
    }

    struct timeval timeout = {5, 500000}; // 5.5s

    redisClusterContext *cc = redisClusterContextInit();
    redisClusterSetOptionAddNodes(cc, CLUSTER_NODE_TLS);
    redisClusterSetOptionConnectTimeout(cc, timeout);
    redisClusterSetOptionRouteUseSlots(cc);
    redisClusterSetOptionEnableSSL(cc, ssl);
    redisClusterSetOptionPassword(cc, CLUSTER_PASSWORD);
    redisClusterConnect2(cc);
    if (cc && cc->err) {
        printf("Error: %s\n", cc->errstr);
        // handle error
        exit(-1);
    }

    redisReply *reply = (redisReply *)redisClusterCommand(cc, "GEOADD Sicily 13.361389 38.115556 %s 15.087269 37.502669 %s", "Catania", "Palermo");
   if (cc && cc->err) {
         printf("Error: %s\n", cc->errstr);
   }
    freeReplyObject(reply);


    redisClusterFree(cc);
    redisFreeSSLContext(ssl);
    return 0;
}

gcc hiredisc-test.c -o hiredisc-test -L/usr/local/lib -lhiredis_cluster -lhiredis_cluster_ssl -lhiredis -lhiredis_ssl