我需要删除10 000个密钥。
更好的方法是:执行此类脚本
EVAL"返回redis.call(' del',解包(redis.call(' keys',ARGV [1])))#34; 0" ROOT "
可能更好的是设置过期时间,Redis会删除它们吗? 但是如何使用Lua脚本在控制台中执行此操作?
脚本(见上文)有效,因为del comman的格式为:
del key1 key2 ...
但Expire仅适用于1个键。
是否可以在lua脚本中执行此操作?
例如:我的应用程序创建一些搜索结果缓存并为每个页面设置ttl = 3600.但是用户想要立即清除缓存,即删除所有匹配的密钥或为它们设置较小的过期。
答案 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