您的位置:首页 > 数据库 > Redis

redis学习篇(十一)-----高级特性之发布与订阅

2016-08-11 00:00 127 查看
发布订阅(pub/sub)是一种消息通信模式,主要的目的是解除消息发布者和消息订阅者之间的耦合,Redis作为一个pub/sub的server,在订阅者和发布者之前起到了消息路由的功能。

SUBSCRIBE、UNSUBSCRIBE 和 PUBLISH 三个命令实现了发布与订阅信息泛型(Publish/Subscribe messaging paradigm), 在这个实现中, 发送者(发送信息的客户端)不是将信息直接发送给特定的接收者(接收信息的客户端),而是将信息发送给频道(channel),然后由频道将信息转发给所有对这个频道感兴趣的订阅者。发送者无须知道任何关于订阅者的信息,而订阅者也无须知道是那个客户端给它发送信息,它只要关注自己感兴趣的频道,以达到解耦合的目的。

订阅/发布的相关指令

--subscribe channel [channel] --
订阅一个或多个频道

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

--publish channel message --
给指定频道发送消息

publish的客户端中
127.0.0.1:6379> publish channel1 'hello world'
(integer) 1   #返回当前收听到消息的客户端数

接受的客户端中
127.0.0.1:6379> subscribe channel1 channel1
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "channel1"
3) (integer) 1
1) "subscribe"
2) "channel1"
3) (integer) 1
1) "message"      #接受类型:消息
2) "channel1"     #来源:来自 channel1 频道
3) "hello world"  #消息内容

--psubscribe pattern [pateern] --
订阅指定模式下的频道

127.0.0.1:6379> psubscribe channel* test*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"   #返回类型:psubscribe订阅成功
2) "channel*"     #订阅的频道模式
3) (integer) 1    #当前订阅频道模式数
1) "psubscribe"
2) "test*"
3) (integer) 2

当psubscribe接收到消息的时候,返回值的类型也不同
1) "pmessage"          #接收消息:pmessage
2) "channel*"          #匹配频道模式:channel*
3) "channel1"          #来自频道:channel1
4) "hello psubscribe"  #消息内容

--unsubscribe [channel] [channel1] --
取消频道的订阅,如果不带参数,则取消当前客户端所有频道的订阅。

--pubsub subcommand [argument] --
根据不同的subcommand返回不同的结果

## pubsub channels [pattern]
列出当前的活跃频道。活跃频道指的是那些至少有一个订阅者的频道,订阅模式的客户端不计算在内。
pattern 参数是可选的:
如果不给出 pattern 参数,那么列出订阅与发布系统中的所有活跃频道。
如果给出 pattern 参数,那么只列出和给定模式 pattern 相匹配的那些活跃频道。

## pubsub numsub [channel1] [channel2]
返回给定频道的订阅者数量,psubscribe的客户端不计算在内。当没有channel参数时,返回空。

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

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

# client-2 订阅 it 和 life 两个频道

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

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

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

## pubsub numpat
返回psubscribe模式的数量。返回的不是订阅模式的客户端的数量,而是客户端订阅的所有模式的数量总和。需要注意的是,这里
返回的结果是订阅次数(类似人次),比如客户端1订阅了AB,客户端2订阅了BC,这里返回的是4

# client-1 订阅了 new.* 和 it.* 模式
1client-1> psubscribe new.* it.*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "new.*"
3) (integer) 1
1) "psubscribe"
2) "it.*"
3) (integer) 2

# client-2 订阅了 it.* 和 life.* 模式
1client-1> psubscribe life.* it.*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "life.*"
3) (integer) 1
1) "psubscribe"
2) "it.*"
3) (integer) 2

# client-3打印 pubsub numpat
client-3> pubsub numpat
(integer) 4
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Redis NoSQL 发布订阅