use*_*492 11 nonblocking blocking redis
在Redis 4.0中,有一个新命令UNLINK用于删除Redis内存中的密钥.
此命令与DEL非常相似:它删除指定的键.就像DEL一样,如果密钥不存在则会被忽略.但是,该 命令在另一个线程中执行实际内存回收, 因此它不会阻塞,而DEL则是.这是命令名称的来源:命令只是从键空间取消链接键.实际删除将在以后异步发生.
所以总是(100%次)使用UNLINK而不是DEL,因为UNLINK是非阻塞的,不像DEL,对吗?
在讨论哪个更好时,让我们看一下这些命令之间的区别。双方DEL并UNLINK释放阻塞模式的重要组成部分。区别在于他们释放价值部分的方式。
DEL总是在阻塞模式下释放值部分。但是,如果该值太大,例如对于LIST或分配过多HASH,则会长时间阻止Redis。为了解决该问题,Redis实现了UNLINK命令,即“非阻塞”删除。
其实,UNLINK是不是总是非阻塞/异步。如果该值较小,例如的大小LIST或HASH小于64,则该值将立即释放。这样,UNLINK与几乎相同DEL,除了它比花费更多的函数调用DEL。但是,如果值很大,则Redis会将值放入列表中,并且该值将由另一个线程释放,即非阻塞释放。这样,主线程必须与后台线程进行一些同步,这也是一个代价。
总之,如果该值很小,DEL则至少等于和UNLINK。如果值非常大(例如,LIST包含成千上万个项目),UNLINK则比更好DEL。您可以随时安全地更换DEL有UNLINK。但是,如果发现线程同步成为问题(多线程总是令人头疼),则可以回滚到DEL。
是。请阅读Lazy Redis,这是 Antirez 更好的Redis。但是原因并非在于unlink是nonblocking命令。原因是取消链接比del更聪明。
UNLINK是一个聪明的命令:它计算对象的释放成本,如果它很小,它将执行DEL应该执行的操作并尽快释放对象。否则,对象将被发送到后台队列进行处理。
另外,我认为更快的方法是我们做出redis的决定:使用DEL表示小键,使用UNLINK表示大键(例如大列表或集合)。我们可以减少不必要的redis计算。
| 归档时间: |
|
| 查看次数: |
2392 次 |
| 最近记录: |