Redis删除大集合操作(Lists,Sets),如果使用del命令,可能会导致redis卡死。毕竟redis是单线程执行的,遇到删除大数据命令,这个命令就会卡住,无法处理其他命令。
del
时间复杂度:O(N),其中N是要删除的密钥数。当要删除的键包含字符串以外的值时,该键的单个复杂性为O(M),其中M是列表、集合、排序集合或哈希中的元素数。删除包含字符串值的单个键是O(1)。
方案一:先rename,再用脚本逐批删除
rename,时间复杂度:O(1)这个命令可以执行非常快
将密钥重命名为newkey。当键不存在时返回错误。如果newkey已经存在,它将被覆盖,当发生这种情况时,RENAME将执行一个隐式DEL操作,因此,如果删除的key包含一个非常大的值,那么即使RENAME本身通常是一个常量时间操作,它也可能导致高延迟。
在集群模式下,key和newkey必须在同一个哈希槽中,这意味着实际上只有具有相同哈希标记的密钥才能在集群中可靠地重命名。
方案二:UNLINK
unlink
时间复杂度:对于每个移除的密钥,无论其大小为0(1)。然后该命令在不同的线程中执行O(N)操作以回收内存,其中N是已删除对象所组成的分配数。
这个命令与DEL非常相似:它删除指定的键。就像DEL a键不存在时被忽略一样。但是,该命令在另一个线程中执行实际的内存回收,因此它没有阻塞,而DEL是。这就是命令名的来源:该命令只是从键空间中取消键的链接。实际删除将在稍后异步进行。