如何使用redis PUBLISH/SUBSCRIBE与nodejs在数据值发生变化时通知客户端?

gui*_* 桂林 95 javascript redis node.js

我正在用NodeJS和Redis编写一个事件驱动的发布/订阅应用程序.我需要一个示例,说明当Redis中的数据值发生变化时如何通知Web客户端.

Alf*_*red 122

OLD只使用引用

依赖

使用express,socket.io,node_redis以及最后但并非最不重要的来自media fire 的示例代码.

安装node.js + npm(作为非root用户)

首先,你应该(如果你还没有这样做还)安装在30秒的Node.js + NPM(因为您应该以正确的方式作为NPM运行):

echo 'export PATH=$HOME/local/bin:$PATH' >> ~/.bashrc
. ~/.bashrc
mkdir ~/local
mkdir ~/node-latest-install
cd ~/node-latest-install
curl http://nodejs.org/dist/node-latest.tar.gz | tar xz --strip-components=1
./configure --prefix=~/local
make install # ok, fine, this step probably takes more than 30 seconds...
curl http://npmjs.org/install.sh | sh
Run Code Online (Sandbox Code Playgroud)

安装依赖项

安装node + npm之后,您应该通过发出以下命令来安装依赖项:

npm install express
npm install socket.io
npm install hiredis redis # hiredis to use c binding for redis => FAST :)
Run Code Online (Sandbox Code Playgroud)

下载示例

您可以从mediafire下载完整的示例.

解压缩包

unzip pbsb.zip # can also do via graphical interface if you prefer.
Run Code Online (Sandbox Code Playgroud)

拉链里面有什么

./app.js

const PORT = 3000;
const HOST = 'localhost';

var express = require('express');

var app = module.exports = express.createServer();

app.use(express.staticProvider(__dirname + '/public'));

const redis = require('redis');
const client = redis.createClient();

const io = require('socket.io');

if (!module.parent) {
    app.listen(PORT, HOST);
    console.log("Express server listening on port %d", app.address().port)

    const socket  = io.listen(app);

    socket.on('connection', function(client) {
        const subscribe = redis.createClient();
        subscribe.subscribe('pubsub'); //    listen to messages from channel pubsub

        subscribe.on("message", function(channel, message) {
            client.send(message);
        });

        client.on('message', function(msg) {
        });

        client.on('disconnect', function() {
            subscribe.quit();
        });
    });
}
Run Code Online (Sandbox Code Playgroud)

./public/index.html

<html>
<head>
    <title>PubSub</title>
    <script src="/socket.io/socket.io.js"></script>
    <script src="/javascripts/jquery-1.4.3.min.js"></script>
</head>
<body>
    <div id="content"></div>
    <script>    
        $(document).ready(function() {
            var socket = new io.Socket('localhost', {port: 3000, rememberTransport: false/*, transports: ['xhr-polling']*/});
            var content = $('#content');

            socket.on('connect', function() {
            });

            socket.on('message', function(message){
                content.prepend(message + '<br />');
            }) ;

            socket.on('disconnect', function() {
                console.log('disconnected');
                content.html("<b>Disconnected!</b>");
            });

            socket.connect();
        });
    </script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

启动服务器

cd pbsb    
node app.js
Run Code Online (Sandbox Code Playgroud)

启动浏览器

如果你启动谷歌浏览器是最好的(因为支持websockets,但不是必需的).访问http://localhost:3000看样本(开头你没有看到任何东西,但PubSub作为标题).

但是在publish频道上pubsub你应该看到一条消息.下面我们发布"Hello world!"到浏览器.

来自./redis-cli

publish pubsub "Hello world!"
Run Code Online (Sandbox Code Playgroud)

  • 样本很老,所以最新的socket.io/express模块​​,甚至node.js都不是最新的.我会尝试更新代码.此代码还有另一个巨大的问题,它为每个连接的用户打开另一个redis连接.那应该只是改为.我必须先工作,但之后我尝试更新代码. (5认同)

nak*_*nak 24

这是一个没有很多依赖关系的简化示例.你仍然需要npm install hiredis redis

节点JavaScript:

var redis = require("redis"),
    client = redis.createClient();

client.subscribe("pubsub");
client.on("message", function(channel, message){
  console.log(channel + ": " + message);
});
Run Code Online (Sandbox Code Playgroud)

...将它放在pubsub.js文件中并运行 node pubsub.js

在redis-cli中:

redis> publish pubsub "Hello Wonky!"
(integer) 1
Run Code Online (Sandbox Code Playgroud)

应该显示:pubsub: Hello Wonky!在终端运行节点!恭喜!

2013年4月23日其他:我还要注意,当客户订阅发布/订阅频道时,它会进入订阅者模式并且仅限于订阅者命令.您只需要创建redis客户端的其他实例.client1 = redis.createClient(), client2 = redis.createClient()因此,一个可以处于订户模式,另一个可以发出常规DB命令.


nel*_*nic 7

完整的 Redis Pub/Sub示例(使用Hapi.js和Socket.io 进行实时聊天)

我们试图理解Redis Publish/Subscribe(" Pub/Sub "),所有现有的例子都已过时,过于简单或没有测试.所以我们使用Hapi.js + Socket.io + Redis Pub/Sub示例编写了一个完整的实时聊天,并进行了端到端测试!

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

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

我们鼓励您结帐/试试这个例子,而不是在这里粘贴它(没有任何上下文).

我们建立了使用它Hapi.jschat.js文件去耦从哈皮,可以很容易地与使用基本 的node.js http服务器表达(等)