redis的zset的底层实现_redis的unlink命令底层实现原理分析del和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类型不会做异步删除。


版权声明:本文为weixin_29885875原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。