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 { @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); } }
测试程序:
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"); } }
相关推荐
赵强老师在传智播客的Oracle课程是专为IT专业人士和对数据库技术感兴趣的学员设计的一系列教学资料,旨在深入浅出地讲解Oracle的核心概念、功能以及实际操作技巧。 在赵强老师的课程中,你可以学到以下几个重要的...
想要好好地学习Oracle数据库的朋友呀,你错过了她就太不值得了。里面有好多的Oracle操作命令可能你都没接触过吧。好了,话不多多说。坚信资料不错!你,值得拥有!OK.还有,之所有要你2分打赏,是我给了你这么好的...
精通JSP编程 作者赵强 编 12-18节
《精通JSP编程》是赵强先生的一部深入解析JSP技术的专业著作,该书针对JSP编程进行了全面且深入的讲解,旨在帮助读者掌握JSP的核心概念和技术,提升Web应用开发能力。根据提供的文件名列表,我们可以推测书籍的章节...
根据提供的文件信息,我们可以推断出这是一份与Java Server Pages (JSP)相关的学习资料介绍,特别是关于赵强编写的《精通JSP编程》这本书的相关信息。下面将基于这个理解来生成相关知识点。 ### 一、JSP基础概念 ...
今天,我们将与赵强老师一同探索数学领域的一个重要主题——“生活中的大数”。这个主题通过生动的例子和清晰的逻辑,帮助孩子们在日常生活中感知和理解大数的存在及其重要性。 “生活中有大数”,这不仅是一句简单...
5. **多表查询与子查询的选择**:当两者都能实现需求时,尽量选择多表查询,因为它只需要对数据库进行一次操作,效率通常更高。 6. **处理NULL值**:在Oracle中,NULL表示无效、未指定或未知的值,它不等于空格或0...
教程名称:Oracle 数据库赵强视频教程【3天】教程目录:【】Oracle安装与管理、SQL语句(赵强)【】Orcale存储过程jdbc与Orcale大文本操作等(赵强)【】SQL简单查询触发器视图(赵强) 资源太大,传百度网盘了,链接在...
本资料包“day2013-0110-webLogic配置和集群(赵强).zip”包含了关于WebLogic的配置与集群搭建的详细教程,旨在帮助用户深入了解WebLogic的核心功能和管理技巧。 一、WebLogic基础配置 1. 安装与启动:首先,我们...
本文将针对一份面向二年级学生的数学学习教案进行解读,这份教案的标题为:“二年级数学生活中的大数赵强PPT学习教案”。 教案的核心目标是帮助孩子们理解并能够应用生活中的大数。课程内容不仅限于数学知识的传授...
《LoadRunner性能测试巧匠训练营》是一本深入讲解LoadRunner性能测试的教材,由赵强和邹伟伟两位专家共同编著。该资源提供的是完整版,且无需密码即可解压阅读,对于想要学习和提升LoadRunner性能测试技能的人来说,...
这种模式的优势在于能够实时互动,方便教师与学生之间的沟通,并且便于资源的分享。培训内容包括文字、图片、实验演示以及在线讨论等多方面内容,力求让学员全方位掌握 Oracle 数据库的知识。 - **理论教学**:占...
例如,缓存(Cache)和虚拟存储器(VM)的结合,优化了内存与硬盘的交互,提高了存储效率。磁盘阵列通过RAID技术实现容量和速度的提升,同时提高数据的可用性和安全性。此外,大规模集群存储如Google的存储系统,...
NoSQL数据库与传统的关系型数据库相比,其主要优点包括高并发读写能力、海量数据存储、高可扩展性以及高可用性。然而,NoSQL数据库也有其缺点,例如缺乏事务一致性,缺乏读写实时性,以及不支持复杂的查询操作。 ...
【标题】"java代码-46 赖赵强" 暗示这是一份与Java编程相关的代码示例,可能由一位名为赖赵强的开发者编写或分享。这个标题可能指的是第46个编程练习、问题解决方案或者是某个功能模块的实现。在Java开发中,代码...
微信购物首页用户调研报告主要关注了微信购物首页用户的浏览动机、痛点以及不同用户群体的行为特征。报告通过定性和定量研究方法,包括一对一深访和问卷调查,收集了大量数据,旨在理解用户需求并优化用户体验。...
游戏运营策划是游戏产业中的关键环节,它涵盖了游戏发布前后的各种策略与活动,旨在确保游戏的成功推广、用户获取、用户留存以及收入增长。《游戏运营策划手册》由赵强著,是一部深入探讨这一主题的专业著作。以下是...