【问题标题】:How does Redis work with Rails and SidekiqRedis 如何与 Rails 和 Sidekiq 配合使用
【发布时间】:2025-08-04 15:55:02
【问题描述】:

问题:需要从 Rails 异步发送电子邮件。 环境:Windows 7、Ruby 2.0、Rails 4.1、Sidekiq、Redis

设置好一切后,启动 Sidekiq 并启动 Redis,我可以通过监视器看到排队到 Redis 的邮件请求:

1414256204.699674 "exec"
1414256204.710675 "multi"
1414256204.710675 "sadd" "queues" "default"
1414256204.710675 "lpush" "queue:default" "{\"retry\":true,\"queue\":\"default\",\"class\":\"Sidekiq::Extensions::DelayedMailer\",\"args\":[\"---\\n- !ruby/class 'UserMailer'\\n- :async_reminder\\n- - 673\\n\"],\"jid\":\"d4024c0c219201e5d1649c54\",\"enqueued_at\":1414256204.709674}"

但是邮件方法似乎永远不会被执行。没有发送邮件,也没有显示任何日志消息。

Redis 如何知道在队列中执行作业,是否需要在环境中设置其他东西才能知道应用程序所在的位置?

delayed_job 是更好的解决方案吗?

我在一个窗口启动 redis,在另一个窗口捆绑 exec sidekiq,在第三个窗口启动 rails server。

redis 队列中的项目如何被提取和处理? sidekiq 是否既将内容放入 redis 队列,又检查是否添加了需要处理的内容?

【问题讨论】:

  • 看看 Railscast 教程,你可能漏掉了什么:railscasts.com/episodes/366-sidekiq
  • 我按照引用的 railscast 进行设置。有什么描述 rails -> sidekiq -> redis -> async 方法处理的吗?
  • 你有运行 sidekiq 吗?

标签: ruby-on-rails redis actionmailer


【解决方案1】:

Redis 仅用于存储。它存储要完成的工作。它不执行任何操作。 DelayedJob 使用您的数据库而不是 Redis 来存储作业。

Rails 进程将新作业推送到 Redis。

Sidekiq 进程从 Redis 中弹出作业并执行它们。

在您的MONITOR 输出中,您应该看到Rails 发送邮件时的LPUSH 命令。您还应该看到来自 Sidekiq 的 BRPOP 命令。

您需要确保 Rails 和 Sidekiq 进程使用相同的 Redis 服务器、数据库编号和命名空间(如果有)。他们不这样做是一个常见的问题。

【讨论】: