Redis 作为一个publish/subscribe server,起到了消息路由的功能。订阅者可以通过subscribe和psubscribe命令向Redis server订阅自己感兴趣的消息类型,当发布者通过publish命令向Redis server发送特定类型的消息时。订阅该消息类型的全部client都会收到此消息。这里消息的传递是多对多的。一个client可以订阅多个channel,也可以向多个channel发送消息。

下图为大家展示了Redis消息机制的体系架构。

发布者和订阅者都是Redis客户端,Channel则为Redis服务器端,发布者将消息发送到某个的频道,订阅了这个频道的订阅者就能接收到这条消息。Redis的这种发布订阅机制与基于主题的发布订阅类似,Channel相当于主题。

下面列出来了Redis发布消息、订阅消息的相关命令。

publish:发送消息:Redis采用PUBLISH命令发送消息,其返回值为接收到该消息的订阅者的数量。 subscribe:订阅某个频道:Redis采用SUBSCRIBE命令订阅某个频道,其返回值包括客户端订阅的频道,目前已订阅的频道数量,以及接收到的消息,其中subscribe表示已经成功订阅了某个频道。 psubscribe:模式匹配:模式匹配功能允许客户端订阅符合某个模式的频道,Redis采用PSUBSCRIBE订阅符合某个模式所有频道,用“”表示模式,“”可以被任意值代替。

案例一:一个消息生产者,两个消息消费者

案例二:两个消息生产者,一个消息消费者

案例三:Redis消息机制的Java API

添加依赖:

redis.clients    jedis    3.1.0

消息监听器类:

import redis.clients.jedis.JedisPubSub; public class RedisMsgPubSubListener extends JedisPubSub {    @Override    public void unsubscribe() {        super.unsubscribe();    }     @Override    public void unsubscribe(String... channels) {        super.unsubscribe(channels);    }     @Override    public void subscribe(String... channels) {        super.subscribe(channels);    }     @Override    public void psubscribe(String... patterns) {        super.psubscribe(patterns);    }     @Override    public void punsubscribe() {        super.punsubscribe();    }     @Override    public void punsubscribe(String... patterns) {        super.punsubscribe(patterns);    }     @Override    public void onMessage(String channel, String message) {        System.out.println("channel:" + channel + "receives message :" + message);        this.unsubscribe();    }     @Override    public void onPMessage(String pattern, String channel, String message) {     }     @Override    public void onSubscribe(String channel, int subscribedChannels) {        System.out.println("channel:" + channel + "is been subscribed:" + subscribedChannels);    }     @Override    public void onPUnsubscribe(String pattern, int subscribedChannels) {     }     @Override    public void onPSubscribe(String pattern, int subscribedChannels) {     }     @Override    public void onUnsubscribe(String channel, int subscribedChannels) {        System.out.println("channel:" + channel + "is been unsubscribed:" + subscribedChannels);    }}

测试程序:

package demo.redis;import redis.clients.jedis.Jedis;public class TestMain {   @Test    public void testSubscribe() throws Exception{        Jedis jedis = new Jedis("localhost");        RedisMsgPubSubListener listener = new RedisMsgPubSubListener();        jedis.subscribe(listener, "redisChatTest");        //other code    }    @Test    public void testPublish() throws Exception{        Jedis jedis = new Jedis("localhost");        jedis.publish("redisChatTest", "Hello World");        Thread.sleep(5000);        jedis.publish("redisChatTest", "Hello Redis");    }}

nodejs redis 发布订阅_「赵强老师」Redis的消息发布与订阅相关推荐

  1. javacore分析工具_「赵强老师」如何分析Java的内存溢出问题

    一.什么是内存溢出? 内存溢出(OOM:out of memory)通俗理解就是内存不够,通常在运行大型软件或游戏时,软件或游戏所需要的内存远远超出了你主机内安装的内存所承受大小,就叫内存溢出. 在J ...

  2. go mongodb排序查询_「赵强老师」MongoDB中的索引(下)

    (四)索引的类型三:复合索引(Compound Index)** MongoDB支持复合索引,即将多个键组合到一起创建索引.该方式称为复合索引,或者也叫组合索引,该方式能够满足多键值匹配查询使用索引的 ...

  3. redis 发布订阅实际案例_【赵强老师】Redis的消息发布与订阅

    欢迎关注赵强老师微信公众号:myitshare Redis 作为一个publish/subscribe server,起到了消息路由的功能.订阅者可以通过subscribe和psubscribe命令向 ...

  4. dbf如何导入oracle_「赵强老师」第一个Oracle的手工管理的备份和恢复

    一.什么是手工管理的备份与恢复? 尽管在Oracle中,已经有了RMAN的备份与恢复.但是作为Oracle备份恢复的一种方式,我们将在本文中通过一个例子来为大家介绍如何使用手工的方式来完成Oracle ...

  5. 【赵强老师】Redis的事务和示例

    首先,我们还是看一下视频,来学习一下Redis的事务. [赵强老师]Redis的事务和示例 Redis会将一个事务中的所有命令序列化,然后按顺序执行.Redis不可能在一个Redis事务的执行过程中插 ...

  6. 【赵强老师】Redis简介和安装配置

    先看视频. [赵强老师]Redis简介和安装配置 什么是Redis? Redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串 ...

  7. 【赵强老师】Redis的RDB持久化

    先看视频. [赵强老师]Redis的RDB持久化 Redis是一种高级key-value数据库.它跟memcached类似,不过数据可以持久化,而且支持的数据类型很丰富.有字符串,链表,集 合和有序集 ...

  8. oracle select 行数据_【赵强老师】什么是Oracle的数据字典?

    欢迎关注赵强老师微信公众号:myitshare 数据字典是oracle存放有关数据库信息的地方,几乎所有的系统信息和对象信息都可在数据字典中进行查询.数据字典是oracle数据库系统的信息核心,它是一 ...

  9. oracle 锁表如何查看_【赵强老师】第一个Oracle的手工备份和恢复

    欢迎关注赵强老师微信公众号:myitshare 一.什么是手工管理的备份与恢复? 尽管在Oracle中,已经有了RMAN的备份与恢复.但是作为Oracle备份恢复的一种方式,我们将在本文中通过一个例子 ...

最新文章

  1. Gazebo构建小车模型并通过ROS控制
  2. 关于java和c的选择结构和循环结构
  3. vuecli3的svgicon_vue-cli3引入svg图标全过程以及遇到的坑
  4. winform空间批量控制
  5. 机器学习算法系列(一)-基础机器学习算法入门
  6. 单例模式的七种实现方法(java版)
  7. 配送A/B评估体系建设实践
  8. 吴恩达机器学习笔记二之多变量线性回归
  9. canvas笔记-canvas中用户与图形交互
  10. Android 蓝牙模块
  11. 层叠性(HTML、CSS)
  12. 让博客园博客自动生成章节目录索引
  13. 酷!有人把火星车都造出来了,教程全面开源
  14. 台式机是计算机进入睡眠状态,电脑如何进入睡眠状态_电脑如何设置自动睡眠...
  15. 力天创见智慧客流方案
  16. 证明小于60阶的无非阿贝尔单群用到的定理
  17. 【CVPR2020】百度入选22篇论文涵盖全视觉领域!
  18. CAN总线的8种常见故障及解决方法
  19. JavaWeb之JSP原理
  20. 用计算机解组合题,2016年同等学力申硕计算机综合试题解析--数学基础

热门文章

  1. 中value大小_如何在Spring/SpringBoot 中做参数校验?你需要了解的都在这里!
  2. 客户端软件 大华_大华“飞燕”,一款主打稳定WiFi的路由器!
  3. 二进制安装kubernetes v1.11.2 (第十章 kube-scheduler集群部署)
  4. 响应式布局rem的使用
  5. ret2dir:Rethinking Kernel Isolation(翻译)
  6. python获取路径下所有文件_Python 之 glob读取路径下所有文件夹或文件方法
  7. 通过 Telnet 在 Linux 终端中观看ASCII 星球大战
  8. QT之Win10安装(五)
  9. Gstreamer之No package ‘gstreamer-1.0‘ found解决(十一)
  10. Mac上emacs使用ggtags