http://redis.io/commands/rpoplpush
“RPOPLPUSH(或阻塞变体的BRPOPLPUSH)提供了一种避免此问题的方法:使用者获取消息并同时将其推送到处理列表中。它将使用LREM命令来删除消息处理完邮件后,从处理列表中获取。“
建议使用此可靠的队列模式。这里的关键是从队列中删除项目,除非进程完成。但我最大的困惑是为什么需要处理队列?通过仅保留一个队列可以实现相同的目标。
答案 0 :(得分:1)
当您有多个任务访问队列时会出现问题,这可能就是这种情况。如果将其保留在队列中,则会冒另一个任务挑选它并复制该消息。要解决这个问题并具有可靠性,可以使用RPOPLPUSH,它将消息从主队列中取出,将其推送到辅助队列,并为任务提供消息,以执行任务想要执行的操作。现在可以出现辅助任务,可以访问主队列而无需担心重复。
最后,当第一个任务完成时,它可以LREM并从处理队列中删除消息,从而完成其工作。任何任务都会重复此过程,您可以为所有任务实现单个处理队列,或为每个任务实现单独的处理队列,这取决于您的用例。