2017-08-10 141 views
1

我正在为hiredis编写一个包装,以便在redis节点关闭时启用与重新连接的发布/订阅功能。在Hiredis异步上下文中设置TCP存活时间间隔

我正在使用异步redis API。

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

不过,断开回调不叫,直到很久以后(当我破坏包含对应redisAsyncContext认购对象。

我认为,要解决这个可能是使用TCP存活。

所以,我发现,有一个在net.h合适redis的功能:

INT redisKeepAlive(redisContext * C,INT间隔);

然而,以下似乎表明REDI sKeepAlive功能已经从库中故意省略:

$ 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似乎没有任何效果。

回答

0

我发现redisKeepAlive的实现包含代码演示如何获取直接访问底层的socket描述:

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; 

}

也许这会帮助别人..