約德爾命令中的官文件:什麼是redis del命令的時間複雜性?
時間複雜度:O(N),其中N是將被刪除的鍵的數目。當一個要刪除的鍵持有一個字符串以外的值時,這個鍵的個體複雜度是O(M),其中M是列表中元素的數量,集合,排序集合或散列值。刪除包含字符串值的單個鍵是O(1)。
爲什麼?我認爲,即使密鑰指的是複雜類型,del的時間複雜度應該總是爲O(1),redis db找到密鑰的哈希值並將其除去,其中時間複雜度爲O(1)。
在redis的烴源代碼,「刪除命令」的工具是如下:
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個鍵應該具有複雜度O(1),而不管複雜類型的
。
這個問題很好,它的真正意思是'爲什麼DEL的複雜度被列爲O(n),當密鑰是一個複雜的數據結構時「我也希望它是O(1),嘆氣 – user3175580