概述
发布订阅(pub/sub)是一种消息通讯模式,发布者发布消息,订阅者接收消息.
- 客户端订阅频道
channel1
- 新消息发送到频道
channel1
,客户端接收消息
常用命令
subscribe [channel1] [channel2]
订阅一个或多个频道,频道必须是完整名称,不会根据匹配符匹配
127.0.0.1:6379> subscribe channel1 channel2
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "channel1"
3) (integer) 1
1) "subscribe"
2) "channel2"
3) (integer) 2
unsubscribe [channel1] [channel2]
退订一个或多个频道,如果没有指定频道,会退订所有已经订阅的频道
127.0.0.1:6379> punsubscribe news.*
1) "punsubscribe"
2) "news.*"
3) (integer) 0
psubscribe [pattern1] [pattern2] … [pattern]
订阅一个或多个符合给定模式的频道,每个模式以*
作为匹配符,比如 news* 匹配所有以 news 开头的频道( news.facebook、 news.google、 news.twitter 等等)
127.0.0.1:6379> psubscribe news.* food.*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "news.*"
3) (integer) 1
1) "psubscribe"
2) "food.*"
3) (integer) 2
punsubscribe [pattern1] [pattern2] … [pattern]
退订一个或多个符合给定模式的频道,每个模式以*
作为匹配符,比如 news* 匹配所有以 news 开头的频道( news.facebook、 news.google、 news.twitter 等等)
如果没有指定模式,会退订所有已经订阅的模式
127.0.0.1:6379> punsubscribe news.*
1) "punsubscribe"
2) "news.*"
3) (integer) 0
publish [channel] [message]
发布消息到指定频道,返回接收到消息的订阅者数量
127.0.0.1:6379> publish channel1 hellosub
(integer) 1
pubsub [subcommand] [argument]
该命令是查看订阅与发布系统状态的内省命令,由数个不同格式的子命令组成
- pubsub channels [pattern]
列出当前的活跃频道,活跃频道指的是那些至少有一个订阅者的频道, 订阅模式的客户端不计算在内
pattern 参数是可选的:如果不给出 pattern 参数,那么列出订阅与发布系统中的所有活跃频道。 如果给出 pattern 参数,那么只列出和给定模式 pattern 相匹配的那些活跃频道。
127.0.0.1:6379> pubsub channels
1) "channel2"
2) "channel1"
127.0.0.1:6379> pubsub channels channel1*
1) "channel1"
- pubsub numsub [channel1] … [channeln]
返回指定频道的订阅者数量,订阅模式的客户端不计算在内
127.0.0.1:6379> pubsub numsub channel1 channel2
1) "channel1"
2) (integer) 2
3) "channel2"
4) (integer) 2
- pubsub numpat
返回订阅模式的数量,不是订阅模式的客户端的数量,而是客户端订阅的所有模式的数量总和
127.0.0.1:6379> pubsub numpat
(integer) 2
完整实例
如下图gif所示,从左上至右下分别代表客户端1-4
- 客户端1: 发布消息
- 客户端2: 订阅频道 channel1 和 channel2
- 客户端3: 订阅频道 channel1
- 客户端4: 订阅频道 channel2
订阅完成后,在客户端1上分别往 channel1 和 channel2 上发布了两条消息,可以看到,客户端2收到了全部的消息,客户端3和客户端4收到了各自订阅频道上的两条信息.
缺点
Redis 的发布/订阅功能是基础功能,有以下几个缺点:
- Redis 并没有对AMQP, MQTT, Stomp等消息协议进行支持
- Redis 消息没有做持久化,一旦消息被发送,客户端如果没有收到消息就会丢失
- Redis 没有提供消息传输保障,如果客户端连接超时等情况下就不会收到消息
应用场景
显而易见的应用场景有两个:
- 构建实时消息系统,比如普通聊天, 群聊等功能
- 门户网站缓存更新: 后台更新数据后,CMS发布清除缓存消息到指定频道上,客户端缓存系统收到消息后更新缓存