Redis发布订阅

5 发布订阅

发布订阅(pub/sub)是一种消息范式 ,消息的发送者(称为发布者 publish )不会将消息直接发送给特定的接收者(称为订阅者 subscribe)。而是将发布的消息分为不同的类别,无需了解哪些订阅者(如果有的话)可能存在。同样的,订阅者可以表达对一个或多个类别的兴趣,只接收感兴趣的消息,无需了解哪些发布者(如果有的话)存在。

Redis 也提供了发布订阅功能,可以用于消息的传输。Redis 的发布订阅机制包括三个部分,如下:

(1)**发布者:**发布一个消息到 Channel 中;

(2)**订阅者:**订阅一个或多个 Channel,并从 Channel 中接收消息;

(3)Channel: 频道,可以理解为一个主题,将同类型的消息发往同一个主题,有兴趣的用户可以订阅它;

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

注意:一个 Redis 客户端可以订阅任意数量的频道。

下图展示了频道 channel1 , 以及订阅 channel1 频道的三个客户端(client2 、 client5 和 client1)之间的关系:

当有新消息通过 PUBLISH 命令发送给频道 channel1 时, 这个消息就会被发送给订阅它的三个客户端:

订阅频道

shell 复制代码
# 语法:订阅一个或多个频道
SUBSCRIBE channel [channel ...]

# 使用案例:同时订阅了三个频道
127.0.0.1:6379> subscribe msg1 msg2 msg3
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "msg1"
3) (integer) 1
1) "subscribe"
2) "msg2"
3) (integer) 2
1) "subscribe"
2) "msg3"
3) (integer) 3

订阅者/消费者在订阅频道时,不需要管这个频道是否存在。如果不存在,redis会自动创建该频道。

当订阅频道后,会进入等待状态,等待接收信息

发布信息

shell 复制代码
# 语法:向某个频道中发送信息
PUBLISH channel message

# 使用案例:向msg1频道发布一条信息,hello。如果该频道有订阅者会返回订阅者人数,没有返回0
127.0.0.1:6379> publish msg1 hello
(integer) 1

## 订阅者收到的内容
1) "message"
2) "msg1"
3) "hello"

查看频道信息

shell 复制代码
# 语法:查看当前所有频道信息
PUBSUB CHANNELS
# 语法:查看某个频道的订阅人数
PUBSUB NUMSUB [channel [channel ...]]

# 使用案例:
127.0.0.1:6379> pubsub channels
1) "msg2"
2) "msg3"
3) "msg1"

127.0.0.1:6379> pubsub numsub msg1
1) "msg1"
2) (integer) 1

6 客户端可视化工具

在使用外部可视化客户端之前,需要先执行下面的步骤:

  1. 首先你能ping通linux虚拟机
  2. 需要修改redis的配置文件,将ip地址绑定改为 0.0.0.0 意味着任何IP地址都可以访问
  3. 重启redis服务
  4. 检查并关闭Linux的防火墙
bash 复制代码
# 查看防火墙状态,如果显示正在运行,则需要关闭
systemctl status firewalld.service
# Active: active (running) 运行状态 

# 关闭防火墙
systemctl stop firewalld.service

解压缩安装包,然后双击安装程序,安装比较简单,就是让你选择安装路径。

安装完毕后执行该程序

相关推荐
海兰3 小时前
【数据库】tdsql(mysql8.0)优化思考三
数据库·redis
头发还在的女程序员4 小时前
医院陪诊管理系统怎么选择?——2026 年选型避坑与架构参考
java·开发语言·陪诊系统·陪诊app·医院陪诊陪护
CodeStats4 小时前
【Spring事务】Spring事务注解 @Transactional 完整体系:从 MySQL 隔离级别到 MyBatis 原理详解
java·spring·mybatis·事务·transactional
我命由我123455 小时前
Android 开发问题:为 PDFView 设置一个带有黑色边框的背景 drawable,但边框没有生效
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
都叫我大帅哥7 小时前
从Python到Java:为什么企业级Agent最终会选择Java?
java·ai编程
wanderist.7 小时前
Lambda表达式在算法竞赛中的应用
java·开发语言·算法
腻害兔9 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:IM 即时通讯模块,一个被低估的「全功能聊天系统」
java·前端·vue.js·产品经理·ai编程
心念枕惊9 小时前
.NET CORE 授权进阶-角色、策略与动态权限实现
java·前端·.netcore
景同学11 小时前
把 AI 用到线上运维:可行、有效,前提是喂足信息——一次 Full GC 排障实录
java·人工智能·后端
C++、Java和Python的菜鸟11 小时前
第7章 后端Web实战(Tlias系统)
java