发布与订阅

除了可以使用List(列表)来实现消息队列,Redis也提供了发布订阅功能,可用于消息的传递。Redis的发布订阅包括三个部分:发布者、订阅者、频道(Channel)。发布者推送消息至频道,订阅了该频道的订阅者都可以接收到该消息。其中发布者和订阅者都为客户端,Channel为服务端。

虽然与大多数专业消息队列系统(例如kafka)相比,在功能性上多有不足,不支持消息堆积和回溯。但其足够简单,在要求不是很高的场景下可以使用。

publish

发布消息

publish channel message

publish会向channel发送message消息

订阅频道

subscribe channel [channel ...]

订阅者可以订阅一个或多个频道,客户端在订阅之后进入了订阅状态,只能接收subscribe、psubscribe、unsubscribe、punsubscribe四个命令,新的订阅客户端无法接收到订阅前的消息。

取消订阅

unsubscribe [channel ...]

客户端可以通过unsubscribe命令取消对指定频道的订阅,取消后将不再接收消息。

按模式订阅

Redis提供了支持glob风格的订阅命令psubscribe何取消命令punsubscribe。例如下列操作订阅以ch开头的所有频道

127.0.0.1:6379> psubscribe ch*

查询订阅

pubsub channels [pattern]

查询所有至少包含一个订阅者的频道,pattern可以指定模式

pubsub numsub [channel ...]

查看频道订阅的客户端数量

pubsub numprt

查看模式订阅的客户端数量

Keyspace Notification

Redis同时提供了Keyspace Notification的功能,允许客户端订阅特定的频道,接收内部数据改变的事件。例如在删除键mykeys时,会触发两条消息:mykeys del和del mykeys,前者属于keyspace频道表示数据的变化,后者属于keyevent频道表示执行的操作。

设置参数同时订阅keyspace和keyevent频道

127.0.0.1:6379> config set notify-keyspace-events KEA
OK

订阅所有频道

127.0.0.1:6379> psubscribe __key*@0__:*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "__key*@0__:*"
3) (integer) 1

操作数据

127.0.0.1:6379> set hello world
OK
127.0.0.1:6379> del hello
(integer) 1

订阅客户端收到信息

127.0.0.1:6379> psubscribe __key*@0__:*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "__key*@0__:*"
3) (integer) 1
1) "pmessage"
2) "__key*@0__:*"
3) "__keyspace@0__:hello"
4) "set"
1) "pmessage"
2) "__key*@0__:*"
3) "__keyevent@0__:set"
4) "hello"
1) "pmessage"
2) "__key*@0__:*"
3) "__keyspace@0__:hello"
4) "del"
1) "pmessage"
2) "__key*@0__:*"
3) "__keyevent@0__:del"
4) "hello"