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

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

  1. UNLINK key [key ...]

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

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

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

  1. redis> MGET k1 k2 k3
  2. 1) "v1"
  3. 2) "v2"
  4. 3) "v3"
  5.  
  6. redis> UNLINK k1 k2 k3
  7. (integer) 3
  8.  
  9. redis> MGET k1 k2 k3
  10. 1) (nil)
  11. 2) (nil)
  12. 3) (nil)

其他信息

属性
复杂度O(N),其中 N 为被移除键的数量。
版本要求UNLINK 命令从 Redis 4.0 版本开始可用。