UNLINK:以异步方式移除指定的键

在11.11节,我们介绍了如何使用DEL命令去移除指定的键,但这个命令实际上隐含着一个性能问题:因为DEL命令会以同步方式执行移除操作,所以如果待移除的键非常庞大或者数量众多,那么服务器在执行移除操作的过程中就有可能被阻塞。比如,移除一个包含上百万个元素的集合,移除一个包含数十万个键值对的散列,或者一次移除成千上万个键,都有可能引起服务器阻塞。

为了解决这个问题,Redis从4.0版本开始新添加了一个UNLINK命令:

UNLINK key [key ...]

UNLINK命令与DEL命令一样,都可以用于移除指定的键,但它与DEL命令的区别在于,当用户调用UNLINK命令去移除一个数据库键时,UNLINK只会在数据库中移除对该键的引用(reference),而对键的实际移除操作则会交给后台线程执行,因此UNLINK命令将不会造成服务器阻塞。

与DEL命令一样,UNLINK命令也会返回被移除键的数量作为结果。此外,基于兼容方面的原因,Redis将在提供异步移除操作UNLINK命令的同时,继续提供同步移除操作DEL命令。

以下是一个使用UNLINK命令的例子:

redis> MGET k1 k2 k3
1) "v1"
2) "v2"
3) "v3"
redis> UNLINK k1 k2 k3
(integer) 3
redis> MGET k1 k2 k3
1) (nil)
2) (nil)
3) (nil)

其他信息

  • 复杂度:O(N),其中N为被移除键的数量。

  • 版本要求:UNLINK命令从Redis 4.0版本开始可用。