#c #c #redis #hiredis
#c #c #redis #нанятый
Вопрос:
Я пытаюсь запустить простую программу, которая вставит ключ-значение в мой кластер redis из 6 экземпляров (3 master, 3 replica). Я использую hiredis-vip.
Вот программа:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <hircluster.h>
int main(int argc, char **argv)
{
struct timeval timeout = { 1, 500000 }; // 1.5 seconds
redisClusterContext *cc = redisClusterContextInit();
redisClusterSetOptionAddNodes(cc, "172.16.129.68:6379");
redisClusterSetOptionConnectTimeout(cc, timeout);
redisClusterConnect2(cc);
if (cc != NULL amp;amp; cc->err) {
printf("Error: %sn", cc->errstr);
// handle error
exit(-1);
}
redisReply *reply;
reply = (redisReply*)(redisClusterCommand(cc,"SET %s %s", "foo", "hello vishal"));
printf("SET: %sn", reply->str);
freeReplyObject(reply);
redisClusterFree(cc);
return 0;
}
При запуске программы я получаю ошибку сегментации:
Program received signal SIGSEGV, Segmentation fault.
0x00000000004009ed in main (argc=1, argv=0x7fffffffe508) at cluster-example.c:30
30 printf("SET: %sn", reply->str);
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.209.el6_9.2.x86_64 libgcc-4.4.7-18.el6_9.2.x86_64 libstdc -4.4.7-18.el6_9.2.x86_64
(gdb) bt f
#0 0x00000000004009ed in main (argc=1, argv=0x7fffffffe508) at cluster-example.c:30
timeout = {tv_sec = 1, tv_usec = 500000}
cc = 0x7ffff7fdb010
reply = 0x0
redisReply *
имеет нулевое значение, что приводит к ошибке сегментации, когда я использую этот указатель в printf()
.
Что не так в программе?
Правка 1
Я обновил часть своей программы после предложения от @Stamatis Liatsos:
reply = (redisReply*)(redisClusterCommand(cc,"SET %s %s", "foo", "hello vishal"));
if(cc->err)
printf("n[%s::%d]Error: %sn", __FILE__,__LINE__,cc->errstr);
else
printf("SET: %sn", reply->str);
Вот результат, который я получаю:
[cluster-example.c::31]Error: ctx get by node is null
Комментарии:
1. Насколько я могу видеть, redisClusterCommand () может повторно возвращать значение null, и в этом случае ваша переменная cc должна содержать ошибку, которую вы могли бы извлечь с помощью cc-> errstr
Ответ №1:
Я нашел решение именно этой проблемы здесь.
Мы должны настроить контекст для использования слотов перед подключением.
struct timeval timeout = { 1, 500000 }; // 1.5 seconds
redisClusterContext *cc = redisClusterContextInit();
redisClusterSetOptionAddNodes(cc, "172.16.129.68:6379");
redisClusterSetOptionConnectTimeout(cc, timeout);
redisClusterSetOptionRouteUseSlots(cc); //The function that has to be called.
redisClusterConnect2(cc);
if (cc != NULL amp;amp; cc->err) {
printf("Error: %sn", cc->errstr);
// handle error
exit(-1);
}