在我的生产环境中有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”加载的元素只会被加载一次,无论我运行了多少个守护进程服务?
非常感谢您的帮助!
答案 0 :(得分:0)
Wierd,我认为rpop会是原子的。您应该能够使用MULTI强制执行事务,以便其他任何人都无法与该变量进行交互。
http://redis.io/topics/transactions
事务中的所有命令都被序列化并按顺序执行。在执行Redis事务的过程中,永远不会发生由另一个客户端发出的请求。这可以保证命令作为单个隔离操作执行。
更多信息:
https://github.com/StackExchange/StackExchange.Redis/blob/master/Docs/Transactions.md