首页 > 代码库 > Redis的Client设计
Redis的Client设计
本文原创为freas_1990,转载请标明出处:http://blog.csdn.net/freas_1990/article/details/25432823
Redis的client设计如下:
/* With multiplexing we need to take per-clinet state. * Clients are taken in a liked list. */ typedef struct redisClient { int fd; redisDb *db; int dictid; sds querybuf; robj **argv, **mbargv; int argc, mbargc; int bulklen; /* bulk read len. -1 if not in bulk read mode */ int multibulk; /* multi bulk command format active */ list *reply; int sentlen; time_t lastinteraction; /* time of the last interaction, used for timeout */ int flags; /* REDIS_CLOSE | REDIS_SLAVE | REDIS_MONITOR */ int slaveseldb; /* slave selected db, if this client is a slave */ int authenticated; /* when requirepass is non-NULL */ int replstate; /* replication state if this is a slave */ int repldbfd; /* replication DB file descriptor */ long repldboff; /* replication DB file offset */ off_t repldbsize; /* replication DB file size */ } redisClient;
在accpet后,开始创建一个client。
代码如下:
static client createClient(void) { client c = zmalloc(sizeof(struct _client)); char err[ANET_ERR_LEN]; c->fd = anetTcpNonBlockConnect(err,config.hostip,config.hostport); if (c->fd == ANET_ERR) { zfree(c); fprintf(stderr,"Connect: %s\n",err); return NULL; } anetTcpNoDelay(NULL,c->fd); c->obuf = sdsempty(); c->ibuf = sdsempty(); c->mbulk = -1; c->readlen = 0; c->written = 0; c->totreceived = 0; c->state = CLIENT_CONNECTING; aeCreateFileEvent(config.el, c->fd, AE_WRITABLE, writeHandler, c); config.liveclients++; listAddNodeTail(config.clients,c); return c; }窃以为,以下代码写的有点shit。
listAddNodeTail(config.clients,c);这个函数既然命名为createclient就该做create的事,而把listaddnodetail放到外层函数里面实现。
既然在createclient函数里实现了add功能,又再返回一个c指针到外层函数实现超出链接数判断,显得有些畸形。
同学们,你们觉得呢?
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。