Asynchronous 在Hiredis异步上下文上设置TCP keepalive间隔

Asynchronous 在Hiredis异步上下文上设置TCP keepalive间隔,asynchronous,tcp,redis,hiredis,Asynchronous,Tcp,Redis,Hiredis,我正在围绕hiredis编写一个包装器,以便在redis节点出现故障时通过重新连接启用发布/订阅功能 我正在使用异步redisapi 因此,我有一个设置发布者和订阅者的测试工具。然后,线束关闭订阅者正在读取的从属VM 但是,直到很久以后(当我销毁包含相应redisAsyncContext的Subscription对象时),才会调用disconnect回调 我认为解决这个问题的方法可能是使用tcp keepalive 所以我发现net.h中有一个合适的redis函数: int redisKeepA

我正在围绕hiredis编写一个包装器,以便在redis节点出现故障时通过重新连接启用发布/订阅功能

我正在使用异步redisapi

因此,我有一个设置发布者和订阅者的测试工具。然后,线束关闭订阅者正在读取的从属VM

但是,直到很久以后(当我销毁包含相应redisAsyncContext的Subscription对象时),才会调用disconnect回调

我认为解决这个问题的方法可能是使用tcp keepalive

所以我发现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 keepalive间隔

更新 我发现:

int redisEnableKeepAlive(redisContext *c);

但在asyncContext->c上设置此选项并调整REDIS\u KEEPALIVE\u间隔似乎没有效果。

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

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


也许这会对某人有所帮助。

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

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

也许这会对某人有所帮助