Redis(八)进阶:Redis如何实现发布订阅功能?
前言
消息系统
发布/订阅,即 pub/sub,是一种消息通信模式:发布者也称为消息生产者,生产和发送消息到存储系统;订阅者也称为消息消费者,从存储系统接收和消费消息。这个存储系统可以是文件系统 FS、消息中间件 MQ、数据管理系统 DBMS,也可以是 Redis。整个消息发布者、订阅者与存储系统称为消息系统。
消息系统中的订阅者订阅了某类消息后,只要存储系统中存在该类消息,其就可不断的接收并消费这些消息。当存储系统中没有该消息后,订阅者的接收、消费阻塞。而当发布者将消息写入到存储系统后,会立即唤醒订阅者。当存储系统放满时,不同的发布者具有不同的处理方式:有的会阻塞发布者的发布,等待可用的存储空间;有的则会将多余的消息丢失。
当然,不同的消息系统消息的发布/订阅方式也是不同的。例如 RocketMQ、Kafka 等消息中间件构成的消息系统中,发布/订阅的消息都是以主题 Topic 分类的。而 Redis 构成的消息系统中,发布/订阅的消息都是以频道 Channel 分类的。
Redis发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接受消息。
Redis客户端可以订阅任意数量的频道!
subscribe
- 格式:
SUBSCRIBE channel [channel …]
- 功能:Redis 客户端通过一个 subscribe 命令可以同时订阅任意数量的频道。在输出了订阅了主题后,命令处于阻塞状态,等待相关频道的消息。
psubscribe
格式:
PSUBSCRIBE pattern [pattern …]
功能:订阅一个或多个符合给定模式的频道。
说明:这里的模式只能使用通配符 。例如,it 可以匹配所有以 it 开头的频道,像 it.news、it.blog、it.tweets 等;news.*可以匹配所有以 news.开头的频道,像 news.global.today、news.it 等。
publish
- 格式:
PUBLISH channel message
- 功能:Redis 客户端通过一条 publish 命令可以发布一个频道的消息。返回值为接收到该消息的订阅者数量。
unsubscribe
- 格式:
UNSUBSCRIBE [channel [channel …]]
- 功能:Redis 客户端退订指定的频道。
- 说明:如果没有频道被指定,也就是一个无参数的 UNSUBSCRIBE 命令被执行,那么客户端使用 SUBSCRIBE 命令订阅的所有频道都会被退订。在这种情况下,命令会返回一个信息,告知客户端所有被退订的频道。
punsubscribe
- 格式:
PUNSUBSCRIBE [pattern [pattern …]]
- 功能:退订一个或多个符合给定模式的频道。
- 说明:这里的模式只能使用通配符 *。如果没有频道被指定,其效果与 SUBSCRIBE 命令相同,客户端将退订所有订阅的频道。
pubsub
- 格式:
PUBSUB <subcommand> [argument [argument …]]
- 功能:PUBSUB 是一个查看订阅与发布系统状态的内省命令集,它由数个不同格式的子命令组成,下面分别介绍这些子命令的用法。
- pubsub channels
- 格式:
PUBSUB CHANNELS [pattern]
- 功能:列出当前所有的活跃频道。活跃频道指的是那些至少有一个订阅者的频道。
- 说明:pattern 参数是可选的。如果不给出 pattern 参数,将会列出订阅/发布系统中的所有活跃频道。如果给出 pattern 参数,那么只列出和给定模式 pattern 相匹配的那些活跃频道。pattern 中只能使用通配符*。
- pubsub numsub
- 格式:
PUBSUB NUMSUB [channel-1 … channel-N]
- 功能:返回给定频道的订阅者数量。不给定任何频道则返回一个空列表。
- pubsub numpat
- 格式:
PUBSUB NUMPAT
- 功能:查询当前 Redis 所有客户端订阅的所有频道模式的数量总和
实现方式
①命令:
这些命令被广泛用于构建即时通信应用,比如网络聊天室(chatroom)和实时广播、实时提醒等。
②发布订阅的实现:
1、订阅端:
1 | 127.0.0.1:6379> ping |
2、发送端:
1 | 127.0.0.1:6379> ping |
如图所示:
订阅端:
发送端:
③PSUBSCRIBE 命令:订阅指定频道!
1 | PSUBSCRIBE + 频道。。 #订阅给定的模式,可多个 |
④PUBLISH 命令:发送消息至指定频道!
1 | PUBLISH + 频道 +消息 #将信息 message 发送到指定的频道 channel |
⑤PUNSUBSCRIBE命令:退订!
指示客户端退订指定模式,若果没有提供模式则退出所有模式。
⑥SUBSCRIBE:订阅,同上一致。
⑦UNSUBSCRIBE:退订,同上一致。
⑧总结:
Pub/Sub 从字面上理解就是发布(Publish)与订阅(Subscribe),在Redis中,你可以设定对某一个key值进行消息发布及消息订阅,当一个key值上进行了消息发布后,所有订阅它的客户端都会收到相应的消息。这一功能最明显的用法就是用作实时消息系统,比如普通的即时聊天,群聊等功能。