Как использовать redis PUBLISH / SUBSCRIBE с nodejs для уведомления клиентов об изменении значений данных? - PullRequest
95 голосов
/ 14 декабря 2010

Я пишу управляемое событиями приложение публикации / подписки с NodeJS и Redis.Мне нужен пример того, как уведомлять веб-клиентов об изменении значений данных в Redis.

Ответы [ 8 ]

122 голосов
/ 15 декабря 2010

OLD использует только ссылку

Зависимости

использует express , socket.io , node_redis и последний, ноНе в последнюю очередь пример кода из медиа-пламени.

Установите node.js + npm (от имени пользователя root)

Сначала вам следует (если вы этого еще не сделали)установить node.js + npm за 30 секунд (правильный путь, потому что вы должны НЕ запустить npm как root ):

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

Установить зависимости

После того, как вы установили узел + npm, вы должны установить зависимости, выполнив:

npm install express
npm install socket.io
npm install hiredis redis # hiredis to use c binding for redis => FAST :)

Загрузить образец

Вы можете загрузить полный образец с mediafire .

Распаковать пакет

unzip pbsb.zip # can also do via graphical interface if you prefer.

Что внутри zip

. / 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();
        });
    });
}

. / 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>

Запустить сервер

cd pbsb    
node app.js

Запустить браузер

Лучше всего, если вы запустите Google Chrome (из-за поддержки веб-сокетов, но не обязательно).Посетите http://localhost:3000, чтобы увидеть пример (в начале вы не видите ничего, кроме PubSub в качестве заголовка).

Но на publish для канала pubsub вы должны увидеть сообщение.Ниже мы публикуем "Hello world!" в браузере.

От ./redis-cli

publish pubsub "Hello world!"
23 голосов
/ 19 октября 2011

вот упрощенный пример без такого количества зависимостей. Вам все еще нужно 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);
});

... поместите это в файл pubsub.js и запустите node pubsub.js

в редис-кли:

redis> publish pubsub "Hello Wonky!"
(integer) 1

, который должен отображать: pubsub: Hello Wonky! в терминале, работающем узле! Congrats!

Дополнительно 23.04.2013: Я также хочу отметить, что когда клиент подписывается на паб / подканал, он переходит в режим подписчика и ограничен командами подписчика. Вам просто нужно создать дополнительные экземпляры клиентов Redis. client1 = redis.createClient(), client2 = redis.createClient() так что один может находиться в режиме подписчика, а другой может выдавать обычные команды БД.

7 голосов
/ 20 июля 2015

Завершено Пример Redis Pub / Sub ( Чат в реальном времени с использованием Hapi.js & Socket.io)

Мы пытались понять Redis Publish / Subscribe(" Pub / Sub ") и все существующие примеры были либо устаревшими, либо слишком простыми, либо не имели тестов.Итак, мы написали Complete Чат в реальном времени с использованием Hapi.js + Socket.io + Redis Pub / Sub Example с сквозными тестами !

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.js , но файл chat.js отделен от Hapi и может легко использоваться с basic node.js http сервер или express (и т. Д.)

4 голосов
/ 28 февраля 2011

Обрабатывать ошибки redis, чтобы остановить выход nodejs. Вы можете сделать это, написав;

subcribe.on("error", function(){
  //Deal with error
})

Я думаю, вы получите исключение, потому что вы используете тот же клиент, который подписан для публикации сообщений. Создайте отдельный клиент для публикации сообщений, и это может решить вашу проблему.

2 голосов
/ 08 июля 2011

Если вы хотите, чтобы это работало с socket.io 0.7 И внешним веб-сервером, который необходимо изменить (помимо staticProvider -> static проблема):

a) предоставьте имя домена вместо localhost (т. Е. Var socket = io.connect ('http://my.domain.com:3000');) в index.html

b) изменить HOST в app.js (т. Е. Const HOST =' my.domain.com ';)

c) и добавить сокеты в строку 37 app.js (т. е. socket.sockets.on («соединение», функция (клиент) {…')

2 голосов
/ 14 апреля 2011

Извлечение acani-узла на GitHub , особенно файла acani-node-server.js . Если эти ссылки не работают, поищите acani-chat-server среди открытых хранилищ acani GitHub .

1 голос
/ 23 марта 2011

Обновление до кода:

staticProvider

теперь переименовано в

static

см. Руководство по миграции

0 голосов
/ 16 апреля 2011

в соответствии с решением @ alex . если у вас есть ошибка, подобная этой, согласно @ tyler упоминание:

node.js:134
        throw e; // process.nextTick error, or 'error'

event on first tick ^ Error: Redis connection to 127.0.0.1:6379 failed - ECONNREFUSED, Connection refused at Socket.

тогда вам нужно сначала установить Redis . проверить это:

http://redis.io/download

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...