角色
- 发布者 publisher
- 订阅者 subscriber
- 通道 channel
API
订阅
发布:
publish channel msg ;
127.0.0.1:6379> publish A:B 'l am lili'
(integer) 1
返回结果为订阅者数量n
订阅:
subscriber channel
127.0.0.1:6379> SUBSCRIBE A:B
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "A:B"
3) (integer) 1
1) "message"
2) "A:B"
3) "111"
1) "message"
2) "A:B"
3) "l am lili"
接收订阅的频道的消息,但值得注意的是当前发布订阅模式没有消息堆积功能,订阅频道的客户端不能获取订阅前的消息
取消订阅
redis 127.0.0.1:6379> UNSUBSCRIBE channel [channel ...]
127.0.0.1:6379> UNSUBSCRIBE A:B
1) "unsubscribe"
2) "A:B"
3) (integer) 0
在客户端执行SUBSCRIBE
命令时,redis将所有频道的订阅关系保存在pubsub channel
字典里,key是频道的名称,值是一个链表,所有客户端信息以链表存储。
模式匹配
订阅模式
客户端可以订阅全风格的模式以便接收所有来自能匹配到给定模式的频道的消息,支持多通配符
PSUBSCRIBE pattern [pattern ...]
退订模式
将取消订阅匹配该模式的客户端,这个调用不影响其他订阅
PUNSUBSCRIBE [pattern [pattern ...]]
在模式订阅里服务器也将所有模式的订阅关系都保存在服务器状态的pubsub_patterns属性里面。pubsub_patterns是一个链表,每一个节点是一个pubsubPattern,里面有两个属性,pattern记录了被订阅的模式,client属性记录了订阅模式的客户端。
如果你使用redis-cli命令行客户端测试的话,只能通过ctrl+c退订频道和模式,暂时未找打能用命令退订的方式。
PUBSUB
列出至少一个订阅者的频道
127.0.0.1:6379> PUBSUB CHANNELS
1) "redischat
列出频道内订阅者数量
PUBSUB numsub [channel]
127.0.0.1:6379> PUBSUB numsub A:B
1) "A:B"
2) (integer) 1
服务器被订阅模式的数量。
#客户端1
127.0.0.1:6380> PSUBSCRIBE A:*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "A:*"
3) (integer) 1
#客户端2
127.0.0.1:6380> PSUBSCRIBE A:* B:*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "A:*"
3) (integer) 1
1) "psubscribe"
2) "B:*"
3) (integer) 2
#客户端3
127.0.0.1:6380> PUBSUB numpat
(integer) 3
消息队列
队列使用list实现,队列是FIFO先进先出,刚好利用 lpush+rpop,命令实现