如何在redis中使用发布/订阅
redis 使用 publish,subscribe,unsubscribe实现发布订阅消息。
Pub/Sub 的消息将被发送一次,一旦redis服务发送了消息,就不能再次发送。如果订阅者无法处理该消息,该消息将丢失。
如果不想丢失消息,则可以使用redis stream,stream中的消息是持久的,并且支持最多一次,和至少一次。
推送消息的格式
所有订阅接收的消息有三种类型:subscribe,unsubscribe,message
所有订阅接收的消息格式有3个元素组成
第一元素是消息类型(subscribe),第二元素是频道名称(mychanel1),第三个元素是已订阅频道的数量(1)
-
subscribe
注意执行此命令的客户端将进入阻塞,等待接收消息,不可做其他操作。
建议先执行订阅再执行发布,因为只会接收到订阅后到信息。
-
unsubscribe
-
message
当一客户端 执行publish mychannel1 hello,订阅mychannel1频道的客服端将会收到以上消息。 与上面两种类型不同的是,第三个元素是消息的内容。
模式订阅
- psubscribe
模式订阅
例如
PSUBSCRIBE news.*
将收到发送到news.art.figurative、news.music.jazz等频道的所有消息。 - punsubscribe
PUNSUBSCRIBE news.*
将取消订阅该模式的客户端
模式订阅和频道订阅的消息
如果客户端订阅了与已发布的消息匹配的多个模式,或者订阅了与消息匹配的模式和频道,则客户端可能会多次收到一条消息。以下示例显示了这一点:
SUBSCRIBE foo
PSUBSCRIBE f*
在上述示例中,如果消息发送到channel foo,客户端将收到两条消息:一条是message类型,另一条pmessage类型。
pubsub 查看订阅发布的状态
pubsub channels : 查看活跃的频道
pubsub numsub : 查看平道有几个订阅者
pubsub numpat :只统计使用psubcribe订阅的订阅者数量
发布消息
publish命令发送消息,返回值为收到该消息的订阅者数量。
publish 如何将消息给各个订阅者呢?
其实redis处理方式很简单,只是一直维护的这些订阅者的长连接请求。
在服务端看来,客服端发来的subcribe指令与普通指令无差别,服务端收到指令后,会加一个flag 标签,之后便将这个连接信息(频道信息)存在特殊的结构中,等待的publish指令的到来
当服务端收到publish指令后,会匹配相应的频道,再将消息推送给对应的客服端,