我需要删除 10 000 个键。
什么是更好的方法:执行这种脚本
EVAL "return redis.call('del', unpack(redis.call('keys', ARGV[1])))" 0 " ROOT "
可能更好的是设置过期时间,Redis 会删除它们吗?但是如何使用 Lua 脚本在控制台中做到这一点?
该脚本(见上文)有效,因为 del comman dhas 格式:
del key1 key2 ...
Run Code Online (Sandbox Code Playgroud)
但 Expire 仅适用于 1 个键。
是否可以在 lua 脚本中执行此操作?
例如:我的应用程序创建了一些搜索结果缓存并为每个页面设置 ttl = 3600。但用户想立即清除缓存,即删除所有匹配的键或为它们设置较小的过期时间。
如果您尝试删除与前缀匹配的密钥,那么您可以尝试以下命令
redis-cli keys <PREFIX>'*' | xargs redis-cli del
Run Code Online (Sandbox Code Playgroud)
这里的keys <PREFIX> '*'将给出所有具有匹配前缀的键,然后 del 命令将删除所有这些键。
您可以使用(来自 redis cli)删除所有键:
flushall
Run Code Online (Sandbox Code Playgroud)
或从您的命令行 (bash) 运行它
redis-cli --scan --pattern aihello_user* | xargs redis-cli del
Run Code Online (Sandbox Code Playgroud)
无论你DEL还是EXPIRE,一旦Lua脚本运行它就会阻塞其他客户端,如果运行时间太长就会超时lua-time-limit。尽管您不愿意循环,但我强烈建议您这样做。
过期与删除可能会减轻一些即时负载(尚未得到经验证明),因此请随意选择其中之一。在任一情况下,请在操作上使用客户端循环SCAN来调用每个键的命令。如果您的架构中的某个地方有服务器/工作进程,您可以考虑将此任务委托给它,这样客户端就不会保持忙碌。
根据评论编辑:可变参数命令通常DEL比非可变参数命令性能更高,但是在这里您要比较两个不同的操作,因此不能保证。这种DEL方法可能会造成更多阻塞,因为 Redis 实际上会立即删除键 - 如果您有很多键要删除和/或它们的值很大,这可能需要更多时间。该EXPIRE方法试图通过利用 Redis 的延迟过期机制(在可能的情况下使用空闲时间来执行此操作)来避免这种情况,因此理论上由于过期而删除的负载可以更好地分布。确定哪种方法更适合您的最佳方法是测试并比较两者 - 我很想了解您的结果!