欢迎关注赵强老师微信公众号:myitshare

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

  • 添加依赖:
<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>3.1.0</version>
</dependency> 

  • 消息监听器类
import redis.clients.jedis.JedisPubSub;public class RedisMsgPubSubListener extends JedisPubSub {@Overridepublic void unsubscribe() {super.unsubscribe();}@Overridepublic void unsubscribe(String... channels) {super.unsubscribe(channels);}@Overridepublic void subscribe(String... channels) {super.subscribe(channels);}@Overridepublic void psubscribe(String... patterns) {super.psubscribe(patterns);}@Overridepublic void punsubscribe() {super.punsubscribe();}@Overridepublic void punsubscribe(String... patterns) {super.punsubscribe(patterns);}@Overridepublic void onMessage(String channel, String message) {System.out.println("channel:" + channel + "receives message :" + message);this.unsubscribe();}@Overridepublic void onPMessage(String pattern, String channel, String message) {}@Overridepublic void onSubscribe(String channel, int subscribedChannels) {System.out.println("channel:" + channel + "is been subscribed:" + subscribedChannels);}@Overridepublic void onPUnsubscribe(String pattern, int subscribedChannels) {}@Overridepublic void onPSubscribe(String pattern, int subscribedChannels) {}@Overridepublic 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 {@Testpublic void testSubscribe() throws Exception{Jedis jedis = new Jedis("localhost");RedisMsgPubSubListener listener = new RedisMsgPubSubListener();jedis.subscribe(listener, "redisChatTest");//other code}@Testpublic void testPublish() throws Exception{Jedis jedis = new Jedis("localhost");jedis.publish("redisChatTest", "Hello World");Thread.sleep(5000);jedis.publish("redisChatTest", "Hello Redis");}
}

欢迎关注赵强老师微信公众号:myitshare

redis 发布订阅实际案例_【赵强老师】Redis的消息发布与订阅相关推荐

  1. hprof文件分析工具_【赵强老师】如何分析Java的内存溢出问题

    欢迎关注赵强老师微信公众号:myitshare 一.什么是内存溢出? 内存溢出(OOM:out of memory)通俗理解就是内存不够,通常在运行大型软件或游戏时,软件或游戏所需要的内存远远超出了你 ...

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

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

  3. 【赵强老师】MapReduce编程案例之求工资总额

    先看视频. [赵强老师]MapReduce编程案例之求工资总额 Hadoop MapReduce是一个软件框架,基于该框架能够容易地编写应用程序,这些应用程序能够运行在由上千个商用机器组成的大集群上, ...

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

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

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

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

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

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

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

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

  8. 视频教程-赵强老师:大数据从入门到精通(15)Storm-大数据

    赵强老师:大数据从入门到精通(15)Storm 毕业于清华大学,拥有超过13年的工作经验. Oracle认证讲师,拥有6年以上授课经验.精通Oracle数据库.中间(Weblogic)和大数据Hado ...

  9. 视频教程-赵强老师:Oracle数据库从10g到11g(6)管理方案对象-Oracle

    赵强老师:Oracle数据库从10g到11g(6)管理方案对象 毕业于清华大学,拥有超过13年的工作经验. Oracle认证讲师,拥有6年以上授课经验.精通Oracle数据库.中间(Weblogic) ...

最新文章

  1. o oia ospf 路由优先_动态路由OSPF中注入默认路由,原来都是这么玩的,进去看看...
  2. MySQL设置默认引擎和字符集
  3. Spring(19)——Profile(二)
  4. volatile和final
  5. wms仓储系统培训_WMS系统开创智慧仓储新方向
  6. 图像缩放算法_opencv缩放算法
  7. 7-72 分解质因数 (20 分)
  8. linux怎么释放内存占用,如何将linux占用的空间释放
  9. 人生最美妙与最残忍的事情是同一件,那就是不能重来
  10. 双向循环链表的插入与删除
  11. SQLite数据库浅谈
  12. 【干货】2020年陆奇最新万字演讲:世界新格局下的创业创新机会.pdf(附下载链接)...
  13. NET 自定义配置文件 Configuration
  14. Visual Studio 重新生成解决方案 无反映
  15. The Bits(找规律)
  16. c# 设为首页和加入收藏代码
  17. onvif工具测试网络摄像头视频
  18. 汉仪南宫体简 字体如何卸载删除?
  19. uni-app设置屏幕亮度
  20. MATLAB学习笔记(注释超详细)

热门文章

  1. 使用Spring boot,Thymeleaf,AngularJS从零开始构建新的Web应用程序–第3部分
  2. junit5和junit4_JUnit 5 –条件
  3. 抽象工厂和工厂方法示例_工厂方法设计模式示例
  4. Spring项目的按层打包已过时
  5. Java 9:对可选的增强
  6. jenkins复制作业_Jenkins分层作业和作业状态汇总
  7. spring 属性占位符_Spring属性占位符配置器–一些不太明显的选项
  8. Spring –添加Spring MVC –第2部分
  9. jpa 查询 列表_终极JPA查询和技巧列表–第3部分
  10. unchecked异常_为什么要在Java中使用Unchecked异常而不是Checked异常