两个客户端应该如何同时等待Redis中的值?

时间:2016-04-16 17:57:31

标签: redis publish-subscribe

Redis提供 BRPOP ,允许发送方/接收方模式保证交付。

发件人: LPUSH foo_key bar_value
接收方: BRPOP foo_key ### => 'bar_value'

其中 ### 是一个任意的过期间隔,比如15秒。

但是,如果邮件有两个接收器,您应该怎么办?我考虑过以下几个选项:

  1. PUBLISH / SUBSCRIBE ,但如果发件人 PUBLISH 在收件人 SUBSCRIBE <之前发送消息,则会导致竞争条件/ em> s到频道。
  2. 发件人在某个键上调用 SET + EXPIRE ,然后接收者轮询该键直到出现一个值,然后 GET 该值。最终会根据 EXPIRE 超时删除数据。我不喜欢这个选项,因为如果许多客户端同时执行此操作,轮询Redis可能会导致性能不佳,而且响应也不是实时的。
  3. 如何设置具有实时保证交付的多客户端接收器模型?

    只有一条消息将通过我的架构中的特定密钥发送,因此客户端不会意外地两次收到相同的消息。

2 个答案:

答案 0 :(得分:2)

发送方可以将值推送到2个队列,每个接收方一个队列。

每个接收者都可以在配置文件中拥有其队列的名称。接收器可以使用阻塞弹出,因此不涉及轮询。

当然,采用这种方法,如果你的一个接收器停止处理,它将很容易被发现。

答案 1 :(得分:1)

我意识到我可以使用 BRPOPLPUSH 来实现这一目标。

发件人: LPUSH foo_key bar_value后跟EXPIRE foo_key ###
接收方: BRPOPLPUSH foo_key foo_key ### =&gt; bar_value

其中,和以前一样,每个 ### 都是一些任意的过期间隔,比如15秒。