减慢DEL大键的替代方案

时间:2017-05-13 20:25:20

标签: redis

即将推出的Redis 4中有异步UNLINK,但是在那之前,实现大集合密钥的DELete有什么好的替代方案,没有或只有很少的阻塞?

RENAME是一个独特的名字,然后EXPIRE 1秒是一个很好的解决方案吗?首先重命名,以便原始密钥名称可供使用。立即释放内存不是当务之急,Redis可以尽可能地进行异步垃圾收集。

1 个答案:

答案 0 :(得分:2)

EXPIRE不会消除延迟,只会延迟它直到服务器实际到期值(注意Redis使用近似的到期算法)。一旦服务器实际到达该值,它将发出DEL命令,该命令将阻止服务器,直到删除该值。

如果您无法使用v4的UNLINK,那么删除大型集合的最佳方法是逐步耗尽它。这可以通过服务器端Lua脚本轻松实现,以减少带宽,例如:

local target = KEYS[1]
local count = tonumber(ARGV[1]) or 100
local reply = redis.call('SPOP', target, count)
if reply then
  return #reply
else
  return nil
end

要排空,请使用要删除的密钥的名称重复上述脚本,并使用或不使用count参数,直到获得nill Redis回复。