【问题标题】:Delete Sidekiq jobs in batch by string matching通过字符串匹配批量删除 Sidekiq 作业
【发布时间】:2015-10-29 23:40:32
【问题描述】:

我有一个邮件队列。我想删除该队列中的所有Newsletter 作业,只留下sign_up 邮件。我基本上需要找到包含子字符串'Newsletter'的工作。如何在 Rails 控制台或 redis-cli 中执行此操作?

【问题讨论】:

    标签: redis sidekiq


    【解决方案1】:

    据我所知,您基本上只是想以原子方式删除其中带有字符串“Newsletter”的键作为单个事务。这样做的方法是:

    redis-cli -n [some_db] -h [some_host_name] EVAL "return redis.call('DEL', unpack(redis.call('KEYS', '*' .. ARGV[1] .. '*')))" 0 Newsletter
    

    您在上面的代码中所做的是运行一个 lua 脚本,该脚本查询数据库 [some_db] 中包含子字符串“Newsletter”的所有键。然后将它们全部删除。这一切都是作为一个事务完成的,因此从运行KEYS 到删除所有相关键时,不会在 Redis 上运行其他命令。

    相关讨论here

    【讨论】:

    • 我假设我可以单独保留 -n 和 -h 标志,但它给我的错误是“(错误)ERR 错误运行脚本(调用 f_729a221194284c3756b416201c816f2c1996514f):调用 Redis 命令的参数数量错误来自 Lua 脚本”。你知道我做错了什么吗?
    • 另一件事,我阅读了所有键的列表(KEYS *),并没有看到“Newsletter”。我猜 sidekiq 以不同的方式存储作业。
    • @lulalala 是的,“时事通讯”就是一个例子。您需要确切地找到它如何存储它们才能有效。至于错误,请确保您将所有内容完全按照上面的方式进行,并且在 redis 2.6+ 上。对我来说一切都很好,这是我经常在多个 redis 服务器上使用的命令。
    • 我不确定 Sidekiq 如何存储作业。你有什么想法吗?
    【解决方案2】:

    这里是如何删除作业的示例:

    name = 'Newsletter'
    queue = Sidekiq::Queue.new
    
    queue.each do |job|
       job.delete if job.klass.include? name
    end
    

    而不是 klass.include?你可以用任何其他类型的东西来匹配你正在寻找的东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-29
      • 2021-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-12
      • 1970-01-01
      相关资源
      最近更新 更多