static VALUE connection_connect(int argc, VALUE *argv, VALUE self) { redisContext *c; VALUE arg_host = Qnil; VALUE arg_port = Qnil; VALUE arg_timeout = Qnil; if (argc == 2 || argc == 3) { arg_host = argv[0]; arg_port = argv[1]; if (argc == 3) { arg_timeout = argv[2]; /* Sanity check */ if (NUM2INT(arg_timeout) <= 0) { rb_raise(rb_eArgError, "timeout should be positive"); } } } else { rb_raise(rb_eArgError, "invalid number of arguments"); } c = redisConnectNonBlock(StringValuePtr(arg_host), NUM2INT(arg_port)); return connection_generic_connect(self,c,arg_timeout); }
redisAsyncContext *redisAsyncConnect(const char *ip, int port) { redisContext *c = redisConnectNonBlock(ip,port); redisAsyncContext *ac = redisAsyncInitialize(c); memset(ac->ip, 0, sizeof(ac->ip)); memcpy(ac->ip, ip, strlen(ip)); ac->port = port; __redisAsyncCopyError(ac); return ac; }
redisAsyncContext *redisAsyncConnect(const char *ip, int port) { redisContext *c; redisAsyncContext *ac; c = redisConnectNonBlock(ip,port); if (c == NULL) return NULL; ac = redisAsyncInitialize(c); if (ac == NULL) { redisFree(c); return NULL; } __redisAsyncCopyError(ac); return ac; }
static client createClient(char *cmd, size_t len) { int j; client c = zmalloc(sizeof(struct _client)); if (config.hostsocket == NULL) { c->context = redisConnectNonBlock(config.hostip,config.hostport); } else { c->context = redisConnectUnixNonBlock(config.hostsocket); } if (c->context->err) { fprintf(stderr,"Could not connect to Redis at "); if (config.hostsocket == NULL) fprintf(stderr,"%s:%d: %s\n",config.hostip,config.hostport,c->context->errstr); else fprintf(stderr,"%s: %s\n",config.hostsocket,c->context->errstr); exit(1); } /* Suppress hiredis cleanup of unused buffers for max speed. */ c->context->reader->maxbuf = 0; /* Queue N requests accordingly to the pipeline size. */ c->obuf = sdsempty(); for (j = 0; j < config.pipeline; j++) c->obuf = sdscatlen(c->obuf,cmd,len); c->randlen = 0; c->written = 0; c->pending = config.pipeline; /* Find substrings in the output buffer that need to be randomized. */ if (config.randomkeys) { char *p = c->obuf; while ((p = strstr(p,":rand:")) != NULL) { assert(c->randlen < (signed)(sizeof(c->randptr)/sizeof(char*))); c->randptr[c->randlen++] = p+6; p += 6; } } /* redisSetReplyObjectFunctions(c->context,NULL); */ aeCreateFileEvent(config.el,c->context->fd,AE_WRITABLE,writeHandler,c); listAddNodeTail(config.clients,c); config.liveclients++; return c; }
static int luaredis_connect (lua_State *L) { const char *ip = luaL_checkstring(L, 1); int port = luaL_optint(L, 2, 6379); int timeout = luaL_optint(L, 3, -1); int nonblock = lua_toboolean(L, 4); if (timeout == -1) { if (nonblock == 1) { redisContext *con = redisConnectNonBlock(ip, port); return pushConnection(L, con); } else { redisContext *con = redisConnect(ip, port); return pushConnection(L, con); } } else { struct timeval to; to.tv_sec = timeout; to.tv_usec = 0; redisContext *con = redisConnectWithTimeout(ip, port, to); return pushConnection(L, con); } };
static client createClient(const char *cmd, size_t len) { client c = zmalloc(sizeof(struct _client)); if (config.hostsocket == NULL) { c->context = redisConnectNonBlock(config.hostip,config.hostport); } else { c->context = redisConnectUnixNonBlock(config.hostsocket); } if (c->context->err) { fprintf(stderr,"Could not connect to Redis at "); if (config.hostsocket == NULL) fprintf(stderr,"%s:%d: %s\n",config.hostip,config.hostport,c->context->errstr); else fprintf(stderr,"%s: %s\n",config.hostsocket,c->context->errstr); exit(1); } c->obuf = sdsnewlen(cmd,len); c->randlen = 0; c->written = 0; /* Find substrings in the output buffer that need to be randomized. */ if (config.randomkeys) { char *p = c->obuf, *newline; while ((p = strstr(p,":rand:")) != NULL) { newline = strstr(p,"\r\n"); assert(newline-(p+6) == 12); /* 12 chars for randomness */ assert(c->randlen < (signed)(sizeof(c->randptr)/sizeof(char*))); c->randptr[c->randlen++] = p+6; p = newline+2; } } redisSetReplyObjectFunctions(c->context,NULL); aeCreateFileEvent(config.el,c->context->fd,AE_WRITABLE,writeHandler,c); listAddNodeTail(config.clients,c); config.liveclients++; return c; }
/* Create a benchmark client, configured to send the command passed as 'cmd' of * 'len' bytes. * * The command is copied N times in the client output buffer (that is reused * again and again to send the request to the server) accordingly to the configured * pipeline size. * * Also an initial SELECT command is prepended in order to make sure the right * database is selected, if needed. The initial SELECT will be discarded as soon * as the first reply is received. * * To create a client from scratch, the 'from' pointer is set to NULL. If instead * we want to create a client using another client as reference, the 'from' pointer * points to the client to use as reference. In such a case the following * information is take from the 'from' client: * * 1) The command line to use. * 2) The offsets of the __rand_int__ elements inside the command line, used * for arguments randomization. * * Even when cloning another client, the SELECT command is automatically prefixed * if needed. */ static client createClient(char *cmd, size_t len, client from) { int j; client c = zmalloc(sizeof(struct _client)); if (config.hostsocket == NULL) { c->context = redisConnectNonBlock(config.hostip,config.hostport); } else { c->context = redisConnectUnixNonBlock(config.hostsocket); } if (c->context->err) { fprintf(stderr,"Could not connect to Redis at "); if (config.hostsocket == NULL) fprintf(stderr,"%s:%d: %s\n",config.hostip,config.hostport,c->context->errstr); else fprintf(stderr,"%s: %s\n",config.hostsocket,c->context->errstr); exit(1); } /* Suppress hiredis cleanup of unused buffers for max speed. */ c->context->reader->maxbuf = 0; /* Build the request buffer: * Queue N requests accordingly to the pipeline size, or simply clone * the example client buffer. */ c->obuf = sdsempty(); /* If a DB number different than zero is selected, prefix our request * buffer with the SELECT command, that will be discarded the first * time the replies are received, so if the client is reused the * SELECT command will not be used again. */ if (config.dbnum != 0) { c->obuf = sdscatprintf(c->obuf,"*2\r\n$6\r\nSELECT\r\n$%d\r\n%s\r\n", (int)sdslen(config.dbnumstr),config.dbnumstr); c->selectlen = sdslen(c->obuf); } else { c->selectlen = 0; } /* Append the request itself. */ if (from) { c->obuf = sdscatlen(c->obuf, from->obuf+from->selectlen, sdslen(from->obuf)-from->selectlen); } else { for (j = 0; j < config.pipeline; j++) c->obuf = sdscatlen(c->obuf,cmd,len); } c->written = 0; c->pending = config.pipeline; c->randptr = NULL; c->randlen = 0; if (c->selectlen) c->pending++; /* Find substrings in the output buffer that need to be randomized. */ if (config.randomkeys) { if (from) { c->randlen = from->randlen; c->randfree = 0; c->randptr = zmalloc(sizeof(char*)*c->randlen); /* copy the offsets. */ for (j = 0; j < c->randlen; j++) { c->randptr[j] = c->obuf + (from->randptr[j]-from->obuf); /* Adjust for the different select prefix length. */ c->randptr[j] += c->selectlen - from->selectlen; } } else { char *p = c->obuf; c->randlen = 0; c->randfree = RANDPTR_INITIAL_SIZE; c->randptr = zmalloc(sizeof(char*)*c->randfree); while ((p = strstr(p,"__rand_int__")) != NULL) { if (c->randfree == 0) { c->randptr = zrealloc(c->randptr,sizeof(char*)*c->randlen*2); c->randfree += c->randlen; } c->randptr[c->randlen++] = p; c->randfree--; p += 12; /* 12 is strlen("__rand_int__). */ } } } /** * @brief IMPORTANT **/ aeCreateFileEvent(config.el,c->context->fd,AE_WRITABLE,writeHandler,c); listAddNodeTail(config.clients,c); config.liveclients++; return c; }
// 非阻塞连接 redisAsyncContext *redisAsyncConnect(const char *ip, int port) { redisContext *c = redisConnectNonBlock(ip,port); redisAsyncContext *ac = redisAsyncInitialize(c); __redisAsyncCopyError(ac); return ac; }
static redisContext *__connect_nonblock() { /* Reset callback flags */ __test_callback_flags = 0; return redisConnectNonBlock("127.0.0.1", port, NULL); }