【问题标题】:Redis: how to delete multiple keys matching pattern?Redis:如何删除匹配模式的多个键?
【发布时间】:2015-09-10 20:35:16
【问题描述】:

我需要删除 10 000 个密钥。

  1. 有什么更好的方法:执行这种脚本

    EVAL "return redis.call('del', unpack(redis.call('keys', ARGV[1])))" 0 "ROOT"

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

该脚本(见上文)有效,因为 del comman 具有以下格式:

del key1 key2 ...

但 Expire 仅适用于 1 个密钥。

是否可以在 lua 脚本中实现?

例如:我的应用程序创建一些搜索结果缓存并为每个页面设置 ttl = 3600。但用户希望立即清除缓存,即删除所有匹配的键或为它们设置更小的过期时间。

【问题讨论】:

  • 在推荐执行此操作的方法之前,您是否需要在一个原子批处理中删除所有键,还是您的要求更宽松?
  • 我想在有 GUI 的 c# 应用程序中执行这个命令(批处理?)。
  • 所以你知道原子操作会在 Redis 服务器运行时阻塞它,这符合要求(即不要在 Redis 需要保持对服务器可用的环境中运行它请求),对吧?
  • 是的,你是对的。但我不想在我的客户端应用程序中运行循环,因为它不是最佳的且运行时间长。我需要为匹配某些模式的多个键设置过期。我看到在我的示例中使用“键”也不是一个好的解决方案。还有什么?

标签: redis


【解决方案1】:

您可以使用(来自 redis cli)删除所有键:

flushall

或者从你的命令行(bash)运行它

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

【讨论】:

  • 第二个命令应该是接受的答案。它只会删除与提供的模式匹配的键,而不影响其余数据
  • 我会使用unlink 而不是del,因为它是非阻塞的。解释:redis.io/commands/unlink
  • 注意花括号:redis-cli --scan --pattern aihello_user* | xargs redis-cli del {}
【解决方案2】:

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

到期与删除可能会减轻一些直接负担(尚待经验证明),因此请随意选择其中一个。在任何一种情况下,对SCAN 操作使用客户端循环来调用每个键的命令。如果您的架构中有服务器/工作进程,您可以考虑将此任务委派给它,这样客户端就不会一直忙碌。

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

【讨论】:

  • 好的,谢谢。还有一个问题。我的任务是删除密钥。好的,1)我使用 SCAN 并为每条记录调用 EXPIRE。很明显。 2)但我可以调用 DEL 来获取循环中的键子集。什么是更快、更优化和更少锁定?
【解决方案3】:

如果您尝试删除与前缀匹配的键,那么您可以尝试以下命令

redis-cli keys <PREFIX>'*' | xargs redis-cli del

这里 keys '*' 将给出所有具有匹配前缀的键,然后 del 命令将删除所有它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-18
    • 1970-01-01
    • 2019-05-11
    • 2023-03-21
    • 2018-08-09
    • 2019-05-28
    • 2011-04-29
    • 2020-08-05
    相关资源
    最近更新 更多