UNLINK命令总是优于DEL命令吗?

时间:2017-08-22 12:59:14

标签: redis blocking nonblocking

在Redis 4.0中,有一个新命令UNLINK用于删除Redis内存中的密钥。

  

此命令与DEL非常相似:它删除指定的键。   就像DEL一样,如果密钥不存在则会被忽略。然而   命令在不同的线程中执行实际的内存回收,   所以它没有阻止,而DEL 。这是命令名称的位置   来自:命令只是从键空间取消链接键。该   实际删除将在以后异步发生。

所以总是(100%次)使用UNLINK而不是DEL因为UNLINK是非阻塞的,不像DEL,对吗?

2 个答案:

答案 0 :(得分:4)

在讨论哪一个更好之前,让我们来看看这些命令之间的区别。 DELUNLINK都会在阻止模式下释放关键部分。不同之处在于他们释放价值部分的方式。

DEL始终在阻止模式下释放值部分。但是,如果该值太大,例如对于大LISTHASH的分配太多,它会长时间阻止Redis。为了解决这个问题,Redis实现了UNLINK命令,即“非阻塞”命令。删除。

事实上,UNLINK 并非总是非阻塞/异步。如果该值很小,例如LISTHASH的大小小于64,该值将立即释放。这样,UNLINK几乎与DEL相同,只是它比DEL花费的函数调用多一些。但是,如果值很大,Redis会将值放入列表中,并且该值将被另一个线程释放,即非阻塞空闲。这样,主线程必须与后台线程进行一些同步,这也是一种成本。

总之,如果值很小,DEL至少与UNLINK一样好。如果值非常大,例如LIST UNLINK有数千或数百万项,DELDEL好得多。您始终可以使用UNLINK安全地替换DEL。但是,如果您发现线程同步成为问题(多线程总是令人头疼),您可以回滚到{{1}}。

答案 1 :(得分:3)

YES。请阅读antirez的 Lazy Redis is better Redis 。但原因并不是unlink是非阻塞命令。原因是unlink比del更聪明。

  

UNLINK是一个聪明的命令:它计算一个对象的释放成本,如果它非常小,它将只执行DEL应该做的事情并尽快释放对象。否则,将对象发送到后台队列以进行处理。

另外,我认为更快的方法是我们做redis的决定:使用DEL作为小键,使用UNLINK作为一个巨大的键,如大列表或集合。我们可以减少不必要的redis计算。