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是
总结:
- 不管是del还是unlink,key都是同步删除的。
- 使用unlink命令时,如果value分配的空间不大,使用异步删除反而会降低效率,所以redis会先评估一下free value的effort,根据effort的值来决定是否做异步删除。
- 使用unlink命令时,由于string类型的effort一直返回的是1,所以string类型不会做异步删除。