Redis 之 subscribe 订阅模式封装
subscribe 订阅模式封装
Redis
里的订阅/发布命令
命令 | 用例和描述 |
---|---|
subscribe | subscribe channel [channel …] 订阅一个或多个频道 |
unsubscribe | unsubscribe [channel [channel …]] 退订频道,如果没有指定频道,则退订所有的频道 |
publish | publish channel message 给指定的频道发消息 |
psubscribe | psubscribe pattern [pattern …] 订阅给定模式相匹配的所有频道 |
punsubscribe | punsubscribe [pattern [pattern …]] 退订给定的模式,如果没有指定模式,则退订所有模式 |
由于
Redis
在有subscribe
操作时,就会进入订阅模式,此时就不会有publish
功能,因此这个封装进行单一化,只做事件的监听功能。也不做数据处理操作。在取消所有订阅操作后,则会进入正常模式。
废话不多说直接上代码
// RedisSub.jslet EventEmitter = require('events');
let util = require('util');
const ioredis = require("ioredis");/*** Redis 订阅端* @constructor*/
let RedisSub = function (redisConfig ){EventEmitter.call(this);// log开关 true 开启 false 关闭this.LOGGER = false;this.redisC = new ioredis({port: redisConfig.port,host: redisConfig.host,password: redisConfig.password,db: redisConfig.db || 0,family: 4, // 4 (IPv4) or 6 (IPv6)});// 监听订阅成功事件this.redisC.on("subscribe", (channel, count) => {this.LOGGER && console.info("client subscribed to " + channel + "," + count + " total subscriptions");});// 收到消息后执行回调,message是redis发布的消息this.redisC.on("message", (channel, message) => {this.LOGGER && console.log(`Received ${message} from ${channel}`);this.emit(channel, message);});// 监听取消订阅事件this.redisC.on("unsubscribe", (channel, count) => {this.LOGGER && console.info(`client subscribed unsubscribed from ${channel}, ${count} subscriptions`)});}
util.inherits(RedisSub, EventEmitter);RedisSub.prototype.name = '__redisSubscribeClient__';/*** 订阅频道*/
RedisSub.prototype.subscribe = function (...channels) {let self = this;channels.forEach( function (channel) {self.redisC.subscribe(`${channel}`, function (err, count) {if (err) {console.error("Failed to channel: %s subscribe: %s", channel, err.message);} else {self.LOGGER && console.log(`Subscribed channel ${channel} successfully!`);self.LOGGER && console.log(`This client is currently subscribed to ${count} total channels.`);}});});
}/*** 取消订阅频道*/
RedisSub.prototype.unsubscribe = function (...channels) {let self = this;_.forEach(channels, function (channel){self.LOGGER && console.info("subscribe channel: %j", channel);self.redisC.unsubscribe(`${channel}`);});
}/*** 创建 RedisSub* @param redisConfig * @returns {RedisSub}*/
module.exports.init = function (redisConfig ) {return new RedisSub(redisConfig );
};
使用方式
测试用代码
// test.jslet ioredis = require('ioredis');
let RedisSub = require('./redisSub');
let opts = {host:'127.0.0.1',port: 6379,password: ''
}// 创建订阅功能Redis
let subC = RedisSub.init(opts);
// 开启日志
subC.LOGGER=true;
subC.subscribe("test");
subC.on("test", function (msg) {console.log("==> ", msg)
});let redisC = new ioredis({port: opts.port,host: opts.host,password: opts.password,db: opts.db || 0,family: 4, // 4 (IPv4) or 6 (IPv6)
});// 每秒发送一次
setInterval(()=>{redisC.publish("test", "aaaa")
}, 1000);
后记
功能都很简单,没什么特别难的东西,代码弄到本地自己跑了多试试,就理解了,所有都是官方文档里面的,这里也只是进行了功能整合,将平时常用的功能,进行封装了。
具体可以根据项目需要进行扩展。
Redis 之 subscribe 订阅模式封装相关推荐
- SpringBoot整合redis实现发布订阅模式
Redis的发布订阅模式 发布订阅(Pub/Sub):目前广泛使用的通信模型,它采用事件作为基本的通信机制,提供大规模系统所要求的松散耦合的交互模式:订阅者(如客户端)以事件订阅的方式表达出它有兴趣接 ...
- Redis的发布订阅模式
本文源码参看:https://github.com/duktig666/learn-example/tree/5586febea31c2fb368e19fbdba11ed08afd463e0/Redi ...
- Kafka的assign和subscribe订阅模式
一.前言: 使用Apache Kafka消费者组时,有一个为消费者分配对应分区partition的过程,我们可以使用"自动"subscribe和"手动"assi ...
- Redis的发布订阅模式以及在SpringBoot中的使用
1.基本介绍 Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息. Redis 客户端可以订阅任意数量的频道. publish(发布命令) A ...
- RabbitMQ-Java实现Publish/Subscribe订阅模式
订阅模式 一个生成者,多个消费者,每个消费者有自己的队列,生产者没有直接把消息发到队列,而是发给了交换机exchange 适合场景举例:对于同一个消息,要发邮件,也要发短信,因此拆分成两个队列 新建连 ...
- Redis发布与订阅模式
Redis的Pub/Sub实现了发布/订阅消息范式,发布者将消息发布到不同的频道,订阅者订阅感兴趣的频道消息,而不需要关心是谁在发布.这种发布者和订阅者的解耦合方式可以极大的扩展的扩展性网络拓扑. 为 ...
- 使用redis的发布订阅模式实现消息队列
配置文件 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://w ...
- Java笔记-使用RabbitMQ的Java接口实现Publish/Subscribe(订阅模式)
目录 基本概念 代码与实例 基本概念 模型如上: 1. 一个生产者,多个消费者: 2. 每个消费者都有自己的队列: 3. 生产者没有直接把消息发送到队列,而是发送到交换机,通过交换机转发到队列: 4. ...
- Redis 笔记(10)— 发布订阅模式(发布订阅单个信道、订阅信道后的返回值分类、发布订阅多个信道)
1. 发布-订阅概念 发布-订阅 模式包含两种角色,分别为发布者和订阅者. 订阅者可以订阅一个或者若干个频道(channel): 而发布者可以向指定的频道发送消息,所有订阅此频道的订阅者都可以收到此消 ...
最新文章
- C++中运算符重载需要遵循的规则
- 理解AngularJS的作用域Scope
- 紧急通知,读者服务群大调整
- NB-IoT标准落定 规模商用还需跨过成本关
- 朱毅麟:为什么用户接收机定位需要接收4颗导航卫星的信号?
- ABAP常见面试问题
- Linux中写入ISO镜像
- python从txt读取数据并画图_Python读取txt某几列绘图的方法
- kafka消费的三种模式_kafka消费者的三种模式(最多/最少/恰好消费一次)
- ssl 命令访问其他的服务器
- 如何优雅地实现浏览器兼容与CSS规则回退
- 业界聚焦机器人发展:需要攻克核心技术
- 人机关系:基于中国文化的机体哲学分析
- asp毕业设计——基于asp+sqlserver的人力资源管理系统设计与实现(毕业论文+程序源码)——人力资源管理系统
- 回首,缠绵的往事如一帘落花飞扬在寂寞阑珊
- 这应该是最全的软件测试工程师必读书籍
- ZK5.0和客户端+服务器端相结合的编程方式
- OSChina 周一乱弹 ——取经之路才刚刚开始
- Matrix Admin html5网站管理后台源码 Bootstrap响应式模板主题
- 植物大战僵尸2 服务器维护时间,植物大战僵尸2PVP商店多久更新一次