在许多服务器环境中使用redis来发送电子邮件队列

时间:2016-01-21 21:02:55

标签: redis

在我的生产环境中有7个并行服务器。我使用redis将电子邮件排成队列:

$this->getRedis()->lpush('mailsQueue', serialize($mail));

正在侦听队列的守护进程:

do {
    $mail = $this->getRedis()->rpop('mailsQueue');

    if ($mail) {
        // sending an email
    }

    usleep(1000);
} while (true);

当守护程序仅在一个实例中运行时,它运行良好。但是在生产环境中,每个服务器都有自己的守护进程服务。这会产生一个问题,有时候,电子邮件会发送几次。这是因为有时不仅一个守护进程服务从“mailsQueue”列表加载相同的电子邮件。

我怎样才能确定使用“rpop”加载的元素只会被加载一次,无论我运行了多少个守护进程服务?

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

Wierd,我认为rpop会是原子的。您应该能够使用MULTI强制执行事务,以便其他任何人都无法与该变量进行交互。

http://redis.io/topics/transactions

  

事务中的所有命令都被序列化并按顺序执行。在执行Redis事务的过程中,永远不会发生由另一个客户端发出的请求。这可以保证命令作为单个隔离操作执行。

更多信息:

https://github.com/StackExchange/StackExchange.Redis/blob/master/Docs/Transactions.md