同步的,会阻塞。就算阻塞了人家性能也是比绝大多数程序员写的那玩意儿要高。
别瞎猜,看源码。
// 以 Hash 的 HSET 命令为例;List 的 LPUSH 命令你可以自己看
void hsetCommand(client *c) {
int update;
robj *o;
// 1. 查找 key 是否存在,不存在则新建一个,然后在其上进行数据操作
if ((o = hashTypeLookupWriteOrCreate(c, c->argv[1])) == NULL) return;
// 2. 检查 2-3个 参数是否需要将 ZipList 转换为 LinkedList,转换后的哈希表通过 o->ptr 获取
hashTypeTryConversion(o, c->argv, 2, 3);
// 3. 添加键值到哈希表中
update = hashTypeSet(o, c->argv[2]->ptr, c->argv[3]->ptr, HASH_SET_COPY);
addReply(c, update ? shared.czero : shared.cone);
// 4. 变更命令传播
signalModifiedKey(c->db, c->argv[1]);
notifyKeyspaceEvent(NOTIFY_HASH, "hset", c->argv[1], c->db->id);
server.dirty++;
}
P.S. 3.2 之后 ziplist
已经被 quicklist
替代。
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…