使用redis和ruby发布/订阅消息

时间:2013-07-27 21:34:24

标签: ruby redis

我查看了这个文档:

http://redis.io/topics/pubsub

它声明:

订阅频道时,您将收到一条消息,表示为包含三个元素的多批量回复。消息的第一个元素是消息的种类(例如SUBSCRIBE或UNSUBSCRIBE)。消息的第二个元素是您订阅或取消订阅的给定频道的名称。消息的第三个元素是您当前订阅的频道数:

> SUBSCRIBE first second

*3        #three elements in this message: “subscribe”, “first”, and 1
$9        #number of bytes in the element 
subscribe #kind of message
$5        #number of bytes in the element 
first     #name of channel
:1        #number of channels we are subscribed to

很酷,您可以在订阅频道时看到您订阅的频道数量作为批量回复的一部分。现在我尝试在使用ruby时收到此回复:

require 'rubygems'
require 'redis'
require 'json'

redis = Redis.new(:timeout => 0)

redis.subscribe('chatroom') do |on|
  on.message do |channel, msg, total_channels|
    data = JSON.parse(msg)
    puts "##{channel} - [#{data['user']}]: #{data['msg']} - channels subscribed to: #{total_channels}"
  end
end

但是,我根本没有得到那样的答复。它给我的是通道的名称,发布到该通道的数据,然后total_channels是nil,因为没有发回第三个参数。

那就是redis所说的“多批量回复”在哪里?

1 个答案:

答案 0 :(得分:2)

实际上,协议是在订阅操作之后发送订阅回复消息作为第一条消息。您没有在收到的所有邮件中获得订阅频道的数量(就像对订阅/取消订阅的回复一样)。

使用当前版本的redis-rb,您需要一个单独的处理程序来处理订阅/取消订阅回复消息:

require 'rubygems'
require 'redis'
require 'json'

redis = Redis.new(:timeout => 0)

redis.subscribe('chatroom') do |on|
   on.subscribe do |channel, subscriptions|
      puts "Subscribed to ##{channel} (#{subscriptions} subscriptions)"
   end
   on.message do |channel, msg|
      data = JSON.parse(msg)
      puts "##{channel} - [#{data['user']}]: #{data['msg']}"
   end
end

请注意,在您的示例中,订阅数量始终为1。