Redis 发布订阅

1/10/2023 Redis

# Redis 发布订阅

Redis提供了基于“发布/订阅”模式的消息机制,此种模式下,消息发布者和订阅者不进行直接通信,发布者客户端向指定的频道( channel)发布消息,订阅该频道的每个客户端都可以收到该消息。

# 1. 操作命令

Redis主要提供了发布消息、订阅频道、取消订阅以及按照模式订阅和取消订阅等命令。

# 1.1 发布消息

publish channel message

127.0.0.1:6379> PUBLISH ch1 aaa
(integer) 0
1
2

返回值是接收到信息的订阅者数量,如果是0说明没有订阅者,这条消息就丢了(再启动订阅者也不会收到)。

# 1.2 订阅消息

subscribe channel [channel ...]

订阅者可以订阅一个或多个频道,如果此时另一个客户端发布一条消息,当前订阅者客户端会收到消息。

# 客户端A订阅消息
127.0.0.1:6379> SUBSCRIBE ch1 
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "ch1"
3) (integer) 1

# 客户端B发布消息
127.0.0.1:6379> PUBLISH ch1 hello
(integer) 1

# 客户端A接收到消息
1) "message"
2) "ch1"
3) "hello"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

如果有多个客户端同时订阅了同一个频道,都会收到消息。

客户端在执行订阅命令之后进入了订阅状态(类似于监听),只能接收subscribe、psubscribe,unsubscribe、 punsubscribe的四个命令。

# 1.3 查询订阅情况

查看活跃的频道

127.0.0.1:6379> PUBSUB channels
1) "ch1"
1
2

Pubsub 命令用于查看订阅与发布系统状态,包括活跃的频道(是指当前频道至少有一个订阅者),其中[pattern]是可以指定具体的模式,类似于通配符。

查看频道订阅数

127.0.0.1:6379> PUBSUB numsub ch1
1) "ch1"
2) (integer) 1
127.0.0.1:6379> PUBSUB numsub ch2
1) "ch2"
2) (integer) 0
1
2
3
4
5
6

最后也可以通过 help看具体的参数运用

127.0.0.1:6379> PUBSUB help
 1) PUBSUB <subcommand> [<arg> [value] [opt] ...]. Subcommands are:
 2) CHANNELS [<pattern>]
 3)     Return the currently active channels matching a <pattern> (default: '*').
 4) NUMPAT
 5)     Return number of subscriptions to patterns.
 6) NUMSUB [<channel> ...]
 7)     Return the number of subscribers for the specified channels, excluding
 8)     pattern subscriptions(default: no channels).
 9) HELP
10)     Prints this help.
1
2
3
4
5
6
7
8
9
10
11

# 1.4 使用场景和缺点

需要消息解耦又并不关注消息可靠性的地方都可以使用发布订阅模式。

PubSub 的生产者传递过来一个消息,Redis会直接找到相应的消费者传递过去。如果一个消费者都没有,那么消息直接丢弃。如果开始有三个消费者,一个消费者突然挂掉了,生产者会继续发送消息,另外两个消费者可以持续收到消息。但是挂掉的消费者重新连上的时候,这断连期间生产者发送的消息,对于这个消费者来说就是彻底丢失了。

所以和很多专业的消息队列系统(例如Kafka、RocketMQ)相比,Redis 的发布订阅很粗糙,例如无法实现消息堆积和回溯。但胜在足够简单,如果当前场景可以容忍的这些缺点,也不失为一个不错的选择。

正是因为 PubSub 有这些缺点,它的应用场景其实是非常狭窄的。从Redis5.0 新增了 Stream 数据结构,这个功能给 Redis 带来了持久化消息队列,我们马上将要学习到。

Last Updated: 2/14/2023, 6:20:07 PM