IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> Redis 之 subscribe 订阅模式封装 -> 正文阅读

[大数据]Redis 之 subscribe 订阅模式封装

subscribe 订阅模式封装

Redis 里的订阅/发布命令

命令用例和描述
subscribesubscribe channel [channel …] 订阅一个或多个频道
unsubscribeunsubscribe [channel [channel …]] 退订频道,如果没有指定频道,则退订所有的频道
publishpublish channel message 给指定的频道发消息
psubscribepsubscribe pattern [pattern …] 订阅给定模式相匹配的所有频道
punsubscribepunsubscribe [pattern [pattern …]] 退订给定的模式,如果没有指定模式,则退订所有模式

  • 由于 Redis 在有 subscribe操作时,就会进入订阅模式,此时就不会有publish 功能,因此这个封装进行单一化,只做事件的监听功能。也不做数据处理操作。

  • 在取消所有订阅操作后,则会进入正常模式。

废话不多说直接上代码

// RedisSub.js

let 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.js

let 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);


后记

功能都很简单,没什么特别难的东西,代码弄到本地自己跑了多试试,就理解了,所有都是官方文档里面的,这里也只是进行了功能整合,将平时常用的功能,进行封装了。
具体可以根据项目需要进行扩展。

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-03-24 00:37:48  更:2022-03-24 00:38:41 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 7:03:38-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码