Redis:如何删除匹配模式的多个键?

时间:2015-06-24 14:56:31

标签: redis

我需要删除10 000个密钥。

  1. 更好的方法是:执行此类脚本

    EVAL"返回redis.call(' del',解包(redis.call(' keys',ARGV [1])))#34; 0" ROOT "

  2. 可能更好的是设置过期时间,Redis会删除它们吗? 但是如何使用Lua脚本在控制台中执行此操作?

  3. 脚本(见上文)有效,因为del comman的格式为:

    del key1 key2 ...
    

    但Expire仅适用于1个键。

    是否可以在lua脚本中执行此操作?

    例如:我的应用程序创建一些搜索结果缓存并为每个页面设置ttl = 3600.但是用户想要立即清除缓存,即删除所有匹配的密钥或为它们设置较小的过期。

2 个答案:

答案 0 :(得分:2)

无论您是EXPIRE还是lua-time-limit,一旦Lua脚本运行,它将阻止其他客户端,如果运行时间过长,则SCAN超时。尽管你不愿意循环,但我强烈建议你这样做。

到期与删除可能会减少一些即时负载(尚未经验证),所以请随意选择其中一个。在任何一种情况下,在DEL操作上使用客户端循环来调用每个密钥的命令。如果您的架构中某处有服务器/工作进程,则可以考虑将此任务委派给它,以便客户端不会忙碌。

每条评论的编辑:DEL等可变参数通常比非可变参数命令更高效,但是在这里您要比较两种不同的操作,因此无法保证。 EXPIRE方法可能更具阻塞性,因为Redis实际上会立即继续删除密钥 - 如果您有很多要删除的密钥和/或它们的值很大,这可能需要更多时间。 {{1}}方法试图通过利用Redis的延迟到期机制来避免这种情况(它在可能的情况下使用空闲时间),因此理论上,删除到期到期的负载在分布上更好。确定哪种方法更适合您的最佳方法是测试两者并进行比较 - 我很想知道您的结果!

答案 1 :(得分:1)

您可以使用(从redis cli中)删除所有密钥:

flushall

或从命令行(bash)运行它

redis-cli --scan --pattern aihello_user* | xargs redis-cli del