在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/人工智能/ redis訂閱問題:如果不用shell怎么發(fā)布訂閱消息。

redis訂閱問題:如果不用shell怎么發(fā)布訂閱消息。

看到很多關(guān)于redis的例子,但是都是基于客戶端命令行的,比如如下這種:

127.0.0.1:6379> publish channel message

那如果我現(xiàn)在不要用shell, 要用不同的瀏覽器訂閱消息,然后在服務(wù)端發(fā)布消息,這個又怎么做呢? 我用的是node.js.
哪位大神可以放上瀏覽器客戶端和服務(wù)端的訂閱發(fā)布消息的例子,謝謝!

回答
編輯回答
刮刮樂

我自己琢磨出了一種辦法,不知道可行否。
我生成3個客戶端:

  • 處理正常req,res請求的

  • 發(fā)布消息的

  • 訂閱消息的

我本來想用訂閱消息的redis客戶端來處理正常req,res請求但是報錯:

ReplyError: ERR only (P)SUBSCRIBE / (P)UNSUBSCRIBE / PING / QUIT
allowed in this context

后來才知道,原來如果客戶端用于訂閱消息就不能下其他命令進行CRUD。
所以才要再建一個客戶端處理正常的req, res請求。

下面是代碼:

var redis = require('redis');
var express = require('express');
var app = express();
var clientSub = redis.createClient(6379, 'localhost');
var clientPub = redis.createClient(6379, 'localhost');
var clientRes = redis.createClient(6379,'localhost');

clientRes.on('ready', function(err){
    console.log('hello, i handle req/res');
});

clientPub.on('ready', function (err) {
    console.log('hello, i publish');
});

clientSub.on('ready', function (err) {
    console.log('hello, i subscribe');
});

clientSub.subscribe('channel1');

clientSub.on('subscribe', function (channel, count) {
    console.log(`got subscribe event: ${channel} and count is ${count}`);
    setInterval(()=>{
        clientPub.publish('channel1', `hi, i am channel one, message at ${new Date()}`);
    }, 2000);
});

clientSub.on('connect', function () {
    clientSub.on('message', function (channel, message) {
        var response = `received message from ${channel}:${message}`;
        clientRes.lpush('myResponse', response,redis.print);
    });
});

app.get('/', function (req, res) {
    clientRes.lrange('myResponse',0,-1, function(err, result){
        console.log(result[result.length])
        res.send(typeof result);
    })  
})

app.listen(1338, function () {
    console.log('App listening on port 1338!');
});

2017年6月4日 23:56
編輯回答
赱丅呿
2017年6月7日 06:49