1. 程式人生 > >redis del與unlink命令用法及實現

redis del與unlink命令用法及實現

1. DEL 命令

 

DEL key [key ...]

刪除指定的一批keys,如果刪除中的某些key不存在,則直接忽略。

返回值

integer-reply: 被刪除的keys的數量

例子

redis> SET key1 "Hello"
OK
redis> SET key2 "World"
OK
redis> DEL key1 key2 key3
(integer) 2
redis> 

2. unlink 命令

unlink key [key ...]

該命令和DEL十分相似:刪除指定的key(s),若key不存在則該key被跳過。但是,相比DEL

會產生阻塞,該命令會在另一個執行緒中回收記憶體,因此它是非阻塞的。 這也是該命令名字的由來:僅將keys從keyspace元資料中刪除,真正的刪除會在後續非同步操作。

返回值

integer-reply:unlink的keys的數量.

例子

redis> SET key1 "Hello"
"OK"
redis> SET key2 "World"
"OK"
redis> UNLINK key1 key2 key3
(integer) 2
redis> 

3. unlink實現

del和unlink命令底層呼叫的都為delGenericCommand函式, 只是第二個引數不同

===cut===
void delCommand(client *c) {
delGenericCommand(c,0);
}

void unlinkCommand(client *c) {
delGenericCommand(c,1);
}

===cut===

delGenericCommand流程如下:

其中,釋放key代價計算函式lazyfreeGetFreeEffort(),集合型別鍵,且滿足對應編碼,cost就是集合鍵的元數個數,否則cost就是1.

List:4.0只有一種編碼,quicklist,所以編碼無限制,直接返回element個數。

Set:非hash table編碼,即intset編碼時返回1.當一個集合只包含整數值元素, 並且這個集合的元素數量不多時, Redis 就會使用intset作為集合鍵的底層實現。

Hash:同上。

    當hash鍵值滿足下面任意條件編碼為hash table:

->element count > "hash-max-ziplist-entries",default 512.
->value length > "hash-max-ziplist-value",default 64

Zset:非skiplist編碼,返回1.

   當zset鍵值滿足下面任意條件編碼為hash table:

->element count >"zset-max-ziplist-entries",default 128
->value length > "zset-max-ziplist-value", default 64


舉例:
1 一個包含100元素的list key, 它的free cost就是100
2 一個512MB的string key, 它的free cost是

 

總結:

  1. 不管是del還是unlink,key都是同步刪除的。
  2. 使用unlink命令時,如果value分配的空間不大,使用非同步刪除反而會降低效率,所以redis會先評估一下free value的effort,根據effort的值來決定是否做非同步刪除。
  3. 使用unlink命令時,由於string型別的effort一直返回的是1,所以string型別不會做非同步刪除。