1、概述
Redis 发布/订阅(Publish/Subscribe,简称 Pub/Sub)是一种消息传递模式,允许客户端订阅一个或多个通道(channel),并接收其他客户端发布到这些通道的消息。
2、Redis 发布/订阅的主要概念
发布者(Publisher):发布者可以向指定的通道发送消息。每个消息会被发送给所有订阅了该通道的客户端。
订阅者(Subscriber):订阅者可以订阅一个或多个通道,并接收订阅通道的消息。订阅者不会直接与发布者交互,它们只负责监听通道中的消息。
通道(Channel):通道是消息传递的媒介。发布者将消息发布到特定的通道,订阅者从这些通道接收消息。通道的名字是一个字符串,可以是任意的标识符。
3、redis发布订阅的关键特性
多播(Multicasting):当发布者向某个通道发布消息时,所有订阅了该通道的客户端都会收到这条消息。这意味着每个订阅者都可以独立地接收到相同的消息,而不需要与其他订阅者竞争。
无状态:Redis 本身不保存消息的历史记录。一旦消息被发布并分发给所有订阅者,它就会被丢弃。因此,如果某个订阅者在消息发布时没有连接,它将无法接收到该消息。这与消息队列(如 RabbitMQ 或 Kafka)不同,后者通常会保留消息直到所有订阅者都处理完毕。
模式匹配 :Redis 支持基于模式的订阅。订阅者不仅可以订阅具体的通道,还可以订阅符合某些模式的通道。例如,订阅者可以订阅所有以 news.*
开头的通道,从而接收所有匹配该模式的消息。
轻量级:Redis 的发布/订阅机制非常轻量级,适合用于简单的实时通知和事件驱动的应用程序。它不提供复杂的排队、持久化或确认机制,因此不适合用于需要可靠消息传递的场景。
4、Redis 发布/订阅的命令
(1)、SUBSCRIBE channel [channel ...]
作用 :订阅一个或多个通道。订阅后,客户端会进入订阅模式,只能接收消息,不能再执行其他命令(除了 UNSUBSCRIBE 和 PING)。
示例:(订阅news.sports和news.tech两个主题)
java
SUBSCRIBE news.sports news.tech
订阅主题后,打印了相关信息。
(2)、UNSUBSCRIBE [channel [channel ...]]
作用 :取消订阅一个或多个通道。如果不指定通道,则取消订阅所有通道。
示例:(取消订阅news.sports这个主题)
java
UNSUBSCRIBE news.sports
(3)、PSUBSCRIBE pattern [pattern ...]
作用 :订阅符合某个模式的通道。模式可以包含通配符 *
和 ?
,类似于 Unix shell 的文件名匹配规则。
示例:(订阅news.*格式的全部主题,之后只要发布new.开头的主题得消息,这个订阅者就都能接收到)
java
PSUBSCRIBE news.*
(4)、PUNSUBSCRIBE [pattern [pattern ...]]
作用 :取消订阅符合某个模式的通道。如果不指定模式,则取消订阅所有模式。
示例:(取消订阅news.*格式的全部主题)
java
PUNSUBSCRIBE news.*
(5)、PUBLISH channel message
作用 :向指定的通道发布一条消息。所有订阅了该通道的客户端都会收到这条消息。
返回值 :返回收到该消息的订阅者数量。
示例:(向news.sports主题中发布消息)
java
PUBLISH news.sports "Breaking sports news: Team A wins!"
可以看到在订阅了news.*主题后,在新的客户端发布消息可以正常打印。
学海无涯苦作舟!!!