10033

订阅发布

pub/sub 指的是pulish 发布与subscribe 订阅.在redis 中,他是一种消息通信模式:发送者pub 消息,订阅者sub 接受消息.redis 的客户端可以订阅任意数量的频道.

这个功能最明显的用法就是构建实时消息系统,比如普通的即时聊天,群聊等功能.还可以用在门户网站,当编辑更新了某推荐板块的内容后,CMS 发布清除缓存的消息到channel (发送者pub 消息),门户网站的缓存系统通过channel 接收到消息(订阅者sub 消息)后,更新推荐板块的缓存.

1.框架

当有像消息publish到频道channel1时,这个消息就会发送给订阅它的客户端.

2.常用命令

命令描述
psubscribe pattern [pattern]订阅一个或多个符合给定模式的频道
pubsub <subcommand> [argument [argument]]查看订阅与发布系统状态
publish channel message将消息发送给指定的频道
punsubscribe [pattern [pattern]]退订所有给定模式的频道
subscribe channel [channel]订阅给定的一个或多个频道的信息
unsubscribe channel [channel]退订给定的频道

3.实例

############################ 订阅模式 ##############
# psubscribe pattern [pattern] 订阅一个或多个符合给定模式的频道
# 每个模式以 * 作为匹配符,比如 it.* 匹配所有的以 it 开头的频道 (it.news,it.blog 等)
# 以下有2个发送消息redis-cli客户端

# 订阅客户端
client1:6379> psubscribe new.* 
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"           # 返回值的类型:表示订阅成功
2) "new.*"                       # 订阅的模式
3) (integer) 1					# 订阅模式的数量

# 发送客户端1
send1:6379> publish new.test1 "from new.test1"
(integer) 1

# 发送客户端2
send2:6379> publish new.test2 'from test2'
(integer) 1


# 订阅客户端
127.0.0.1:6379> psubscribe new.* 
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "new.*"
3) (integer) 1
1) "pmessage"                    # 返回值的类型
2) "new.*"                              # 信息匹配的模式
3) "new.test1"                      # 信息本身的目标频道
4) "from new.test1"            # 信息的内容
1) "pmessage"
2) "new.*"
3) "new.test2"
4) "from test2"


#################### 查看状态 ###################
# client-1 订阅 news.it 和 news.sport 两个频道

client-1> SUBSCRIBE news.it news.sport
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "news.it"
3) (integer) 1
1) "subscribe"
2) "news.sport"
3) (integer) 2

# client-2 订阅 news.it 和 news.internet 两个频道

client-2> SUBSCRIBE news.it news.internet
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "news.it"
3) (integer) 1
1) "subscribe"
2) "news.internet"
3) (integer) 2

# 首先, client-3 打印所有活跃频道
# 注意,即使一个频道有多个订阅者,它也只输出一次,比如 news.it

client-3> PUBSUB CHANNELS
1) "news.sport"
2) "news.internet"
3) "news.it"

# 接下来, client-3 打印那些与模式 news.i* 相匹配的活跃频道
# 因为 news.sport 不匹配 news.i* ,所以它没有被打印

redis> PUBSUB CHANNELS news.i*
1) "news.internet"
2) "news.it"

# client-1 订阅 news.it 和 news.sport 两个频道

client-1> SUBSCRIBE news.it news.sport
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "news.it"
3) (integer) 1
1) "subscribe"
2) "news.sport"
3) (integer) 2

# client-2 订阅 news.it 和 news.internet 两个频道

client-2> SUBSCRIBE news.it news.internet
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "news.it"
3) (integer) 1
1) "subscribe"
2) "news.internet"
3) (integer) 2

# client-3 打印各个频道的订阅者数量

client-3> PUBSUB NUMSUB news.it news.internet news.sport news.music
1) "news.it"    # 频道
2) "2"          # 订阅该频道的客户端数量
3) "news.internet"
4) "1"
5) "news.sport"
6) "1"
7) "news.music" # 没有任何订阅者
8) "0"

# client-1 订阅 news.* 和 discount.* 两个模式

client-1> PSUBSCRIBE news.* discount.*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "news.*"
3) (integer) 1
1) "psubscribe"
2) "discount.*"
3) (integer) 2

# client-2 订阅 tweet.* 一个模式

client-2> PSUBSCRIBE tweet.*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "tweet.*"
3) (integer) 1

# client-3 返回当前订阅模式的数量为 3

client-3> PUBSUB NUMPAT
(integer) 3

# 注意,当有多个客户端订阅相同的模式时,相同的订阅也被计算在 PUBSUB NUMPAT 之内
# 比如说,再新建一个客户端 client-4 ,让它也订阅 news.* 频道

client-4> PSUBSCRIBE news.*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "news.*"
3) (integer) 1

# 这时再计算被订阅模式的数量,就会得到数量为 4

client-3> PUBSUB NUMPAT
(integer) 4


################## 退订 ################
# PUNSUBSCRIBE [pattern [pattern ...]]
# 如果没有模式被指定,也即是,一个无参数的 PUNSUBSCRIBE 调用被执行,那么客户端使用 PSUBSCRIBE 命令订阅的所有模式都会被退订。在这种情况下,命令会返回一个信息,告知客户端所有被退订的模式。