Redis的Client设计

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指针到外层函数实现超出链接数判断,显得有些畸形。

同学们,你们觉得呢?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值