在 Hiredis 异步上下文上设置 TCP 保持连接间隔



我正在编写一个关于hiredis的包装器,以便在Redis节点出现故障时启用发布/订阅功能并重新连接。

我正在使用异步 redis API。

所以我有一个测试工具,用于设置发布者和订阅者。 然后,线束将关闭订阅者正在从中读取的从属虚拟机。

但是,断开连接回调直到很久以后才会调用(当我销毁包含相应 redisAsyncContext 的订阅对象时(。

我认为解决这个问题的方法可能是使用 tcp 保持连接。

所以我发现 net.h 中有一个合适的 redis 函数:

int redisKeepAlive (redisContext* c, int interval(;

但是,以下内容似乎表明 redisKeepAlive 函数已故意从库中省略:

$ nm libhiredis.a --demangle | grep redisKeepAlive
0000000000000030 T redisKeepAlive
U redisKeepAlive
$ nm libhiredis.a -u --demangle | grep redisKeepAlive
U redisKeepAlive

当然,当我尝试使用调用时,链接器抱怨:

Subscription.cpp:167: undefined reference to `redisKeepAlive(redisContext*, int)'
collect2: error: ld returned 1 exit status

我运气不好吗 - 有没有办法在 Hiredis 异步上下文上设置 TCP 保持连接间隔?

更新我发现这个:

int redisEnableKeepAlive(redisContext *c);

但是在 asyncContext->c 上设置它并调整REDIS_KEEPALIVE_INTERVAL似乎没有效果。

我发现 redisKeepAlive 的实现包含演示如何直接访问底层套接字描述符的代码:

int redisKeepAlive(redisContext *c, int interval) {
int val = 1;
int fd = c->fd;
if (setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, &val, sizeof(val)) == -1){
__redisSetError(c,REDIS_ERR_OTHER,strerror(errno));
return REDIS_ERR;

}

也许这会帮助某人..

最新更新