【赵强老师】Redis的消息发布与订阅
发表于:2025-01-31 作者:千家信息网编辑
千家信息网最后更新 2025年01月31日,Redis 作为一个publish/subscribe server,起到了消息路由的功能。订阅者可以通过subscribe和psubscribe命令向Redis server订阅自己感兴趣的消息类型
千家信息网最后更新 2025年01月31日【赵强老师】Redis的消息发布与订阅
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
添加依赖:
消息监听器类:
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"); }}
消息
订阅
频道
命令
模式
订阅者
发布者
客户
客户端
机制
案例
类型
两个
主题
功能
多个
数量
消费者
生产者
消费
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
我的世界自在岛服务器
县委网信办网络安全工作总结
计算机网络技术具体干嘛的
永久60怎么去人多的服务器
个人网络安全自查工作
u8 账套 数据库
网络安全国家安全例子
单位网络安全汇报总结
通化市开展网络安全执法检查
数组怎么去重复数据库
数据库原子级是什么意思
银行软件开发中心和理财子公司
金蝶k3远程服务器
服务器主板上的cpld的作用
通信集成和软件开发
吉林鲲鹏服务器企业
塘沽网络技术
昆山无忧网络技术
专业服务器维护服务
网络安全法持有个人信息
北仑一站式软件开发服务
银行软件开发中心和理财子公司
ps4游戏怎么切换服务器
软件开发敏捷文化现象定义
网络安全主题安全日活动
如何设置微信服务器
网络技术生产性实训
计算机网络安全管理工作
软件开发自学需要几年
服务器有必要插网线吗