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
NodeJS操作Redis实现消息的发布与订阅的更多相关文章
- Redis实现消息的发布/订阅
利用spring-boot结合redis进行消息的发布与订阅: 发布: class Publish { private static String topicName = “Topic:chat”; ...
- 第三百零一节,python操作redis缓存-管道、发布订阅
python操作redis缓存-管道.发布订阅 一.管道 redis-py默认在执行每次请求都会创建(连接池申请连接)和断开(归还连接池)一次连接操作,如果想要在一次请求中指定多个命令,则可以使用pi ...
- nodejs操作redis总结
本文总结常见的使用node操作redis服务,redis的key是唯一的,如果一个key所对应的存储类型是string,则不能再次覆盖式设置key为hash; 1. 启动redis 这里我们使用doc ...
- 八十五:redis之redis的事物、发布和订阅操作 (2019-11-18 22:54)
redis事物可以一次执行多个命令,事物具有以下特征1.隔离操作:事物中的所有命令都会序列化.按顺序执行,不会被其他命令打扰2.原子操作:事物中的命令要么全部被执行,要么全部都不执行 开启一个事物,以 ...
- Spring Boot使用Redis进行消息的发布订阅
今天来学习如何利用Spring Data对Redis的支持来实现消息的发布订阅机制.发布订阅是一种典型的异步通信模型,可以让消息的发布者和订阅者充分解耦.在我们的例子中,我们将使用StringRedi ...
- Redis消息之发布与订阅
"发布/订阅"可以实现进程间的消息传递 发布的消息不会持久化,只能收到订阅后的消息,执行subscribe命令后客户端会进入"订阅"状态,处于此状态下的客户端不 ...
- 项目中操作redis改brpop阻塞模式为订阅模式的实现-java实习笔记二
更改项目需求以及项目之前阻塞模式问题的叙述已经在上一篇说过了,详情可参考:https://www.cnblogs.com/darope/p/10276213.html ,https://yq.ali ...
- StackExchange.Redis学习笔记(五) 发布和订阅
Redis命令中的Pub/Sub Redis在 2.0之后的版本中 实现了 事件推送的 发布订阅命令 以下是Redis关于发布和订阅提供的相关命令 SUBSCRIBE channel [channe ...
- Redis系列(八):发布与订阅
Redis的发布与订阅,有点类似于消息队列,发送者往频道发送消息,频道的订阅者接收消息. 1. 发布与订阅示例 首先,在本机开启第1个Redis客户端,执行如下命令订阅blog.redis频道: SU ...
随机推荐
- 如何利用Framework模型生成IQD文件
很多Cognos的新手在接触Transform建模的时候对于iqd文件都有一种朦胧的感觉,当然也不必去死记硬别它的格式,下面我们就来说一下如何用Framework工具来生成iqd文件. 1:打开fra ...
- simple-libfm-example-part1
原文:https://thierrysilbermann.wordpress.com/2015/02/11/simple-libfm-example-part1/ I often get email ...
- ArcGIS Pro体验01——申请、下载、安装
ArcGIS Pro采用了Ribbon界面风格,看起来好漂亮,听起来很强大,就是不知道用起来怎么样,在网上看到一个ArcGIS Pro Beta2版本,下载下来,安装启动,好眼熟,像Office201 ...
- ListView与Button共存问题
转载:http://blog.csdn.net/xinqiqi123/article/details/6458030 ListView 和 其它能触发点击事件的widget无法一起正常工作的原 ...
- ORACLE常用监控语句(未完待续)
--查询日志的切换频率 select t1.RECID as srecid ,t2.RECID as erecid ,t1.FIRST_TIME as stime ...
- PHP高级教程-Error
PHP 错误处理 在 PHP 中,默认的错误处理很简单.一条错误消息会被发送到浏览器,这条消息带有文件名.行号以及描述错误的消息. PHP 错误处理 在创建脚本和 Web 应用程序时,错误处理是一个重 ...
- Java从零开始学十九(异常)
一.什么是异常 从字面上讲,就是不正常的现实就是异常. 程序中的异常也是要在程序运行中才会偶尔发生.如果程序还没有运行,编译就报错,这种不叫异常,这种叫编译错误,通常是语法上的错误 二.java中异常 ...
- #define中的“#”和“##”的作用
在#define中,标准只定义了#和##两种操作: #用来把参数转换成字符串: ##则用来连接两个前后两个参数,把它们变成一个字符串.
- 如何解决Cydia提示错误
删除/etc/apt/sources.list.d该目录下的cydia.list进入var/lib/apt/lists删掉此文件夹下的所有文件,以及partial下的文件,但须保留这个空文件夹.进入/ ...
- 5、main方法详解
public class HelloWorld { public static void main(String[] args){ System.out.print("Hello World ...