使用nodejs和redis发布订阅(node_redis)

时间:2011-02-28 09:51:32

标签: node.js redis publish-subscribe

我正在尝试使用nodejs和node_redis构建一个通用发布/订阅服务器,该服务器接收来自具有通道名称的浏览器的请求,并响应任何已发布该通道的数据。为此,我使用来自浏览器的长轮询请求,并在通道上收到消息时发送响应来处理这些请求。

对于每个新请求,都会创建一个用于订阅频道的对象(当且仅当它尚不存在时)。

clients = {};

//when request comes in,
clients[channel] = redis.createClient();
clients[channel].subscribe(channel);

这是处理订阅频道的最佳方式,还是有其他更直观的方式?

4 个答案:

答案 0 :(得分:4)

我不知道您的设计是什么,但您可以在多个渠道订阅一个redis客户端(在您订阅客户端之后,您只能订阅其他渠道或在此连接中取消订阅:http://redis.io/commands/subscribe) ,因为在收到消息后,您可以获得该消息来自哪个频道的完整信息。然后,您可以将此消息分发给所有感兴趣的客户。

这对我有点帮助,因为我可以将消息类型放在通道名称中,然后从小函数中为每条消息动态选择操作,而不是为每个具有单独逻辑的通道生成单独的订阅。

在我的node.js服务器中,我只有2个redis客户端:

  1. 所有标准操作的简单客户端 - lpushsadd
  2. 订阅客户端 - 通过订阅频道侦听消息,然后使用第一个redis客户端将此消息分发到所有会话(存储为每种频道类型的集合)。

答案 1 :(得分:2)

我想指出您使用socket.io和redis一起发布有关pubsub的帖子。 Socket.io是一个非常好的库=>

How to use redis PUBLISH/SUBSCRIBE with nodejs to notify clients when data values change?

我认为设计非常简单,也应该具有很高的可扩展性。

答案 2 :(得分:1)

这对我来说似乎是一个非常合理的解决方案。你不喜欢它什么?

要记住的是,您可以在每个Redis连接上拥有多个订阅。这可能最终使您的逻辑变得复杂,这与您要求的相反。但是,在规模上这可能是必要的。每个Redis连接都相对便宜,但它确实需要文件描述符和一些内存。

答案 3 :(得分:0)

完成 Redis发布/子示例(实时聊天使用Hapi.js& Socket.io)

我们试图了解Redis发布/订阅(" Pub / Sub ")并且所有现有示例都已过时,过于简单或没有测试。 所以我们使用Hapi.js + Socket.io + Redis Pub / Sub示例编写了一个 完整的实时聊天

  

https://github.com/dwyl/hapi-socketio-redis-chat-example

Build Status Test Coverage Code Climate Dependency Status devDependency Status

Pub / Sub组件只有几行node.js代码: https://github.com/dwyl/hapi-socketio-redis-chat-example/blob/master/lib/chat.js#L33-L40

不是在这里粘贴它(没有任何上下文),我们鼓励你签出/尝试示例

我们使用Hapi.js构建了它,但是来自Hapi的chat.js文件解耦并且可以轻松一起使用基本 node.js http服务器快递(等)