目录
发布订阅模式
Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。
Redis 客户端可以订阅任意数量的频道。
优点
发送者(发布者)不是计划发送消息给特定的接收者(订阅者)。
而是发布的消息分到不同的频道,不需要知道什么样的订阅者订阅。
订阅者对一个或多个频道感兴趣,只需接收感兴趣的消息,不需要知道什么样的发布者发布的。
这种发布者和订阅者的解耦合可以带来更大的扩展性和更加动态的网络拓扑。
推送消息的格式
消息是一个有三个元素的多块响应 。
第一个元素是消息类型:
- subscribe
表示我们成功订阅到响应的第二个元素提供的频道。第三个参数代表我们现在订阅的频道的数量。
- unsubscribe
表示我们成功取消订阅到响应的第二个元素提供的频道。
第三个参数代表我们目前订阅的频道的数量。
当最后一个参数是0的时候,我们不再订阅到任何频道。当我们在Pub/Sub以外状态,客户端可以发出任何redis命令。
- message
这是另外一个客户端发出的发布命令的结果。第二个元素是来源频道的名称,第三个参数是实际消息的内容。
数据库与作用域
发布/订阅与key所在空间没有关系,它不会受任何级别的干扰,包括不同数据库编码。
发布在db 10,订阅可以在db 1。
如果你需要区分某些频道,可以通过在频道名称前面加上所在环境的名称(例如:测试环境,演示环境,线上环境等)。
实例
单开一个 redis 窗口
redis:6379> SUBSCRIBE redisChat
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "redisChat"
3) (integer) 1
另开一个 redis 窗口
直接发布几条信息
redis:6379> PUBLISH redisChat "Redis is a great caching technique"
(integer) 1
redis:6379> PUBLISH redisChat "Learn redis by runoob.com"
(integer) 1
原来的 redis 窗口
将接收到新的消息
redis:6379> SUBSCRIBE redisChat
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "redisChat"
3) (integer) 1
1) "message"
2) "redisChat"
3) "Redis is a great caching technique"
1) "message"
2) "redisChat"
3) "Learn redis by runoob.com"
常见命令
Psubscribe
Redis Psubscribe 命令订阅一个或多个符合给定模式的频道。
每个模式以 *
作为匹配符,比如 it*
匹配所有以 it 开头的频道( it.news 、 it.blog 、 it.tweets 等等)。
news.*
匹配所有以 news. 开头的频道( news.it 、 news.global.today 等等),诸如此类。
- 语法
> PSUBSCRIBE pattern [pattern ...]
Pubsub
Redis Pubsub 命令用于查看订阅与发布系统状态,它由数个不同格式的子命令组成。
- 语法
> PUBSUB <subcommand> [argument [argument ...]]
- 实例
> PUBSUB CHANNELS
1) "redisChat"
Publish
Redis Publish 命令用于将信息发送到指定的频道。
- 语法
> PUBLISH channel message
- 返回值
接收到信息的订阅者数量。
- 实例
> PUBLISH redisChat "Learn redis by runoob.com"
(integer) 1
Punsubscribe
Redis Punsubscribe 命令用于退订所有给定模式的频道。
- 语法
> PUNSUBSCRIBE [pattern [pattern ...]]
- 返回值
这个命令在不同的客户端中有不同的表现。
- 实例
> PUNSUBSCRIBE redisChat
1) "punsubscribe"
2) "redisChat"
3) (integer) 0
Subscribe
Redis Subscribe 命令用于订阅给定的一个或多个频道的信息。
- 语法
> SUBSCRIBE channel [channel ...]
- 返回值
接收到的信息
- 实例
9> SUBSCRIBE redisChat
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "redisChat"
3) (integer) 1
1) "message"
2) "redisChat"
3) "Redis is a great caching technique"
1) "message"
2) "redisChat"
3) "Learn redis by runoob.com"
Unsubscribe
Redis Unsubscribe 命令用于退订给定的一个或多个频道的信息。
- 语法
> UNSUBSCRIBE channel [channel ...]
- 返回值
这个命令在不同的客户端中有不同的表现。
- 实例
> UNSUBSCRIBE redisChat
1) "unsubscribe"
2) "redisChat"
3) (integer) 0