最近项目要把收集到的地图上的点存储到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