SetKeepAlive
Keep client alive even though no command was sent to server for a long time.
This commit is contained in:
parent
63ce20dd15
commit
8d5bc445e5
@ -88,6 +88,8 @@
|
|||||||
|
|
||||||
#define REDIS_READER_MAX_BUF (1024*16) /* Default max unused reader buffer. */
|
#define REDIS_READER_MAX_BUF (1024*16) /* Default max unused reader buffer. */
|
||||||
|
|
||||||
|
#define REDIS_KEEPALIVE_INTERVAL 15 /* seconds */
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
34
net.c
34
net.c
@ -113,6 +113,38 @@ static int redisSetBlocking(redisContext *c, int fd, int blocking) {
|
|||||||
return REDIS_OK;
|
return REDIS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int redisKeepAlive(redisContext *c,int fd,int interval) {
|
||||||
|
int val = 1;
|
||||||
|
|
||||||
|
if (setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, &val, sizeof(val)) == -1){
|
||||||
|
__redisSetError(c,REDIS_ERR_OTHER,strerror(errno));
|
||||||
|
return REDIS_ERR;
|
||||||
|
}
|
||||||
|
|
||||||
|
val = interval;
|
||||||
|
if (setsockopt(fd, IPPROTO_TCP, TCP_KEEPIDLE, &val, sizeof(val)) < 0) {
|
||||||
|
__redisSetError(c,REDIS_ERR_OTHER,strerror(errno));
|
||||||
|
return REDIS_ERR;
|
||||||
|
}
|
||||||
|
|
||||||
|
val = interval/3;
|
||||||
|
if (val == 0) val = 1;
|
||||||
|
if (setsockopt(fd, IPPROTO_TCP, TCP_KEEPINTVL, &val, sizeof(val)) < 0) {
|
||||||
|
__redisSetError(c,REDIS_ERR_OTHER,strerror(errno));
|
||||||
|
return REDIS_ERR;
|
||||||
|
}
|
||||||
|
|
||||||
|
val = 3;
|
||||||
|
if (setsockopt(fd, IPPROTO_TCP, TCP_KEEPCNT, &val, sizeof(val)) < 0) {
|
||||||
|
__redisSetError(c,REDIS_ERR_OTHER,strerror(errno));
|
||||||
|
return REDIS_ERR;
|
||||||
|
}
|
||||||
|
|
||||||
|
return REDIS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static int redisSetTcpNoDelay(redisContext *c, int fd) {
|
static int redisSetTcpNoDelay(redisContext *c, int fd) {
|
||||||
int yes = 1;
|
int yes = 1;
|
||||||
if (setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &yes, sizeof(yes)) == -1) {
|
if (setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &yes, sizeof(yes)) == -1) {
|
||||||
@ -241,6 +273,8 @@ int redisContextConnectTcp(redisContext *c, const char *addr, int port, struct t
|
|||||||
goto error;
|
goto error;
|
||||||
if (redisSetTcpNoDelay(c,s) != REDIS_OK)
|
if (redisSetTcpNoDelay(c,s) != REDIS_OK)
|
||||||
goto error;
|
goto error;
|
||||||
|
if (redisKeepAlive(c,s,REDIS_KEEPALIVE_INTERVAL) != REDIS_OK)
|
||||||
|
goto error;
|
||||||
|
|
||||||
c->fd = s;
|
c->fd = s;
|
||||||
c->flags |= REDIS_CONNECTED;
|
c->flags |= REDIS_CONNECTED;
|
||||||
|
Loading…
Reference in New Issue
Block a user