NodeJS操作Redis實現消息的發布與訂閱


首先先說一下流程:

1.保存數據到Redis,然后將member值publish到 chat頻道(publish.js功能)

2.readRedis.js文件此前一直在監聽chat頻道,readRedis.js文件接收到member后,用它作為條件去Redis中去查找,拿到score數據

代碼如下:

publish.js文件:

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

function zadd(key, score, member) {  
    client.zadd(key, score, member, function () {
        client.publish("chat", member);//client將member發布到chat這個頻道
        //然后訂閱這個頻道的訂閱者就會收到消息
    });
}
for (var i = 0; i < 10; i++) {  
    zadd("z", i, "" + i);//發布10次
    console.log("第" + i + "次");
}

readRedis.js文件:

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

function getRedisData() {  
    //客戶端連接redis成功后執行回調
    client.on("ready", function () {
        //訂閱消息
        client.subscribe("chat");
        client.subscribe("chat1");
        console.log("訂閱成功。。。");
    });

    client.on("error", function (error) {
        console.log("Redis Error " + error);
    });

    //監聽訂閱成功事件
    client.on("subscribe", function (channel, count) {
        console.log("client subscribed to " + channel + "," + count + "total subscriptions");
    });

    //收到消息后執行回調,message是redis發布的消息
    client.on("message", function (channel, message) {
        console.log("我接收到信息了" + message);
        dealWithMsg(message);
    });

    //監聽取消訂閱事件
    client.on("unsubscribe", function (channel, count) {
        console.log("client unsubscribed from" + channel + ", " + count + " total subscriptions")
    });
}

function dealWithMsg(message) {  
    //按照message查詢內容
    client1.zscore("z", message, function (err, reply) {
        console.log(message + "的內容是:" + reply);
    });
}
getRedisData();  

 當publish的內容為對象的時候,要把對象轉化成Buffer類型,例如:

function publishRegisterResult(responseBody) {
    responseBody = {
        name: "lw",
        age: 30
    };
    var bufferBody = new Buffer(JSON.stringify(responseBody), 'utf8');
    redis.ac_register_redis.publish(config.redis_prefix.special_register_result, bufferBody, function (err, result) {
        if (err) {
            console.log("publish register result error: ", err.toString());
        } else {
            console.log("publish register result success");
        }
    });
}

 注意, 只要客戶端訂閱了頻道, 除了SUBCRIBE,UNSUBCRIBE,PSUBCRIBE,PSUBCRIBE,就不能執行其他命令。

參考:http://wiki.jikexueyuan.com/project/redis/subscribe-to-release-mechanism.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM