Redis发布、订阅模式(PUB-SUB)详解
Redis的发布订阅(Pub/Sub)机制是一种消息通信模式,用于消息的广播。它允许多个客户端订阅(Subscribe)特定的频道(Channel),并在消息发布者(Publisher)向频道发布消息时,所有订阅该频道的客户端都能接收到消息。
工作原理
-
通信方式:
- Redis的发布-订阅模式基于消息的发布与订阅。消息由发布者发布到频道(Channel),而订阅者则可以订阅一个或多个频道,接收发布者发送到这些频道的消息。
-
频道(Channel):
- 频道是消息的通道,发布者将消息发送到特定的频道,订阅该频道的订阅者会接收到这些消息。频道在Redis中是一个由字符串标识的名字。
-
发布消息:
- 发布者通过向指定频道发送消息来发布消息。多个订阅者可以订阅同一个频道,发布者发送的消息将被所有订阅了该频道的订阅者接收。
- 订阅消息:
- 订阅者通过执行订阅命令来订阅一个或多个频道。一旦订阅成功并且频道有消息发布,订阅者将接收到这些消息。
- 取消订阅 :
- 订阅者可以随时取消对某个或所有频道的订阅,取消订阅后将不再接收该频道的消息。
使用方法
- 发布消息 :
-
使用Redis的
PUBLISH
命令向指定的频道发布消息。redisPUBLISH channel message
其中,
channel
是频道的名称,message
是要发送的消息内容。
-
-
订阅频道:
-
使用Redis的
SUBSCRIBE
命令订阅一个或多个频道。redisSUBSCRIBE channel [channel ...]
-
Redis还支持模式订阅(
Pattern Subscription
),可以使用PSUBSCRIBE
和PUNSUBSCRIBE
命令订阅和取消订阅模式。 -
例如 PSUBSCRIBE news* 可以订阅所有以 news 开头的频道。
-
订阅成功后,Redis客户端将进入订阅模式,等待接收频道发布的消息。
-
返回值为当前订阅的频道数量。
-
-
取消订阅:
-
使用Redis的
UNSUBSCRIBE
命令取消对一个或多个频道的订阅。redisUNSUBSCRIBE [channel [channel ...]]
如果不指定频道名称,则取消所有频道的订阅。
-
Tips:
- 消息丢失 :
- 如果订阅者在消息发布之前或之后才订阅或取消订阅某个频道,那么该订阅者可能会错过在它未订阅期间发布的消息。也就是说,只有在订阅者实时在线并且订阅了频道的情况下才能接收到消息。
- 无持久化 :
- Redis的Pub/Sub模式不会持久化消息,也就是说,消息在发布后立即被传递给当前在线的订阅者,之后不会保存。如果订阅者断开连接或Redis服务器重启,已发布但未接收的消息将会丢失。
- 无确认机制 :
- Pub/Sub模式中没有类似于消息队列中的确认机制,没有办法确保消息一定被所有订阅者成功处理。例如,如果某个订阅者在处理消息时崩溃,消息不会重新发送给该订阅者。
- 非事务性 :
- 消息的发布和接收是非事务性的。发布者发布消息后,不会等待订阅者的应答,即便订阅者在消息发布后立即掉线,发布者也不会知道。
由于这些无保证性,Redis的Pub/Sub模式主要适用于那些对消息可靠性要求不高的应用场景。