// t_hash.c voidhsetCommand(client *c) { // 执行hset命令的函数 int i, created = 0; robj *o;
if ((c->argc % 2) == 1) { // 检查参数个数是否正确 addReplyErrorFormat(c,"wrong number of arguments for '%s' command",c->cmd->name); return; } // 判断hash的key是否存在,如果不存在创建一个新的,默认用ZipList if ((o = hashTypeLookupWriteOrCreate(c,c->argv[1])) == NULL) return; // 该函数见下一段代码 hashTypeTryConversion(o,c->argv,2,c->argc-1); // 判断是否需要转为HT编码,代码见最后一段
for (i = 2; i < c->argc; i += 2) // 循环遍历每一个键值对,进行set操作 // HashTypeSet会检查ZipList中元素数目是否达到上限 created += !hashTypeSet(o,c->argv[i]->ptr,c->argv[i+1]->ptr,HASH_SET_COPY); // 后面省略 ... }