2017-08-10 82 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; 

}

也許這會幫助別人..