【发布时间】:2017-03-23 11:10:03
【问题描述】:
del 命令的官方文档:
时间复杂度:O(N),其中 N 是要移除的键的数量。当要删除的键包含字符串以外的值时,该键的单个复杂度为 O(M),其中 M 是列表、集合、排序集或散列中元素的数量。删除包含字符串值的单个键是 O(1)。
为什么?我认为即使key引用了一个复杂类型,del的时间复杂度应该一直是O(1)。redis db找到key的hash值并移除它,这个操作的时间复杂度是O(1)。
在redis源代码中,“del命令”的实现如下:
void delCommand(client *c) {
int deleted = 0, j;
for (j = 1; j < c->argc; j++) {
expireIfNeeded(c->db,c->argv[j]);
if (dbDelete(c->db,c->argv[j])) {
signalModifiedKey(c->db,c->argv[j]);
notifyKeyspaceEvent(NOTIFY_GENERIC,
"del",c->argv[j],c->db->id);
server.dirty++;
deleted++;
}
}
addReplyLongLong(c,deleted);
}
如上,删除1个key的复杂度应该是O(1),不管是什么复杂类型。
【问题讨论】:
-
这个问题很好,它真正的意思是'为什么当键是复杂的数据结构时,DEL 的复杂性被列为 O(n)。我也希望它是 O(1),sigh .
标签: redis