华子目录
- 什么是发布与订阅?
- 常用命令
- `psubscribe pattern1 [pattern2...]`
- `subscribe channel1 [channel2...]`
- `publish channel message`
- `punsubscribe pattern1 [pattern2...]`
- `unsubscribe [channel1 [channel2...]]`
- `pubsub subcommand argument1 [argument2...]`
- 示例1
- 示例2
什么是发布与订阅?
Redis
发布订阅(pub/sub
)是一种消息通信模式
:发送者(pub)发送消息
,订阅者(sub)接受消息。
Redis
客户端可以订阅
任意数量的频道
!
下图展示了频道 channel1
,以及订阅这个频道
的三个客户端 —— client1 、client2 和 client3
之间的关系:
当有新消息
通过 publish
命令发送给频道 channel1
时, 这个消息就会被发送给订阅它的三个客户端
:
常用命令
命令 | 说明 |
---|---|
psubscribe pattern1 [pattern2...] | 订阅 一个或多个符合给定模式 的频道 |
subscribe channel1 [channel2...] | 订阅 给定的一个或多个频道的信息(即:创建频道 ) |
publish channel message | 将信息发送 到指定的频道 |
punsubscribe pattern1 [pattern2...] | 退订 所有给定模式 的频道 |
unsubscribe [channel1 [channel2...]] | 退订 给定的频道 |
pubsub subcommand argument1 [argument2...] | 查看 订阅与发布系统状态 |
psubscribe pattern1 [pattern2...]
- 在
Redis
中,PSUBSCRIBE
命令用于订阅
一个或多个模式(pattern
),以便当与这些模式匹配的新频道(channel
)上有消息发布时
,客户端能够收到这些消息。
具体来说,PSUBSCRIBE pattern1 [pattern2 ...]
命令的作用如下:
PSUBSCRIBE
: 这是Redis
命令的名称,用于模式订阅。pattern1 [pattern2 ...]
: 这些是你要订阅的模式列表。模式通常使用通配符
(如*
或?
)来定义,以便可以匹配多个频道。
例如:
- 假设你有三个频道:
chat1
,chat2
, 和news.sport
。 - 你想要订阅所有以
chat
开头的频道和所有以news.
开头的频道。
你可以使用以下命令:
PSUBSCRIBE chat* news.*
-
这样,当
chat1
、chat2
或任何以news.
开头的频道上有新消息发布时,你的客户端都会收到这些消息。 -
与
SUBSCRIBE
命令(用于订阅特定的频道)不同,PSUBSCRIBE
允许你基于模式订阅多个频道,这使得你可以更灵活地处理来自多个频道的消息。
注意:为了接收这些消息,你还需要使用 pmessage
命令(或相关的 Redis
客户端库方法)来读取它们。当你从模式订阅的频道中接收到消息时,这些消息将以 pmessage
的形式发送给你,其中包含了原始的消息内容以及发送消息的频道名称和模式匹配的信息。
subscribe channel1 [channel2...]
- 在
Redis
中,SUBSCRIBE
命令用于订阅一个或多个特定的频道(channel
)。当你使用SUBSCRIBE
命令时,你会告诉Redis
你对某个或多个频道的消息感兴趣,并希望在这些频道上有新消息发布时能够收到通知。
具体来说,SUBSCRIBE channel1 [channel2 ...]
命令的作用如下:
SUBSCRIBE
: 这是Redis
命令的名称,用于频道订阅。channel1 [channel2 ...]
: 这些是你要订阅的频道列表。每个频道都是一个字符串,表示一个特定的消息传递通道。
例如,假设你有三个频道:news
, weather
, 和 stock
。如果你只对 news
和 weather
频道的消息感兴趣,你可以使用以下命令来订阅它们:
SUBSCRIBE news weather
-
一旦你订阅了这些频道,当这些频道上有新消息发布时,
Redis
就会将消息发送给你的客户端。
-
当你收到消息时,它们会以
message
的形式发送给你,其中包含了原始的消息内容以及发送消息的频道名称。你可以使用Redis
客户端库提供的方法来读取这些消息。
publish channel message
- 在
Redis
中,PUBLISH
命令用于向指定的频道(channel
)发布消息
。当消息被发布到某个频道时
,所有订阅了该频道的客户端都会收到该消息
。
具体来说,PUBLISH channel message
命令的作用如下:
PUBLISH
: 这是Redis
命令的名称,用于发布消息。channel
: 这是你要发布消息的频道的名称
。它是一个字符串,表示一个特定的消息传递通道。message
: 这是你要发布的消息的内容
。它也是一个字符串,可以包含任何你想要发送的数据。
例如,假设你有一个名为 news
的频道,并且你想要向该频道发布一条包含最新新闻的消息。你可以使用以下命令:
PUBLISH news "Latest news: The stock market is up today!"
-
这条命令会将字符串
"Latest news: The stock market is up today!"
发布到名为news
的频道上。所有订阅了该频道的客户端都会立即收到这条消息。
-
需要注意的是,如果
没有任何客户端订阅了指定的频道
,那么发布的消息将不会被存储或转发给任何客户端
。此外,如果频道名称不存在,Redis
也会将其视为一个有效的频道并尝试发布消息,但如果没有客户端订阅该频道,则消息将被丢弃。
punsubscribe pattern1 [pattern2...]
- 在
PUNSUBSCRIBE
命令中,你可以指定一个或多个模式来取消订阅
。例如:
PUNSUBSCRIBE pattern1 pattern2
最后,如果你只是想要取消对某个特定频道的订阅(而不是基于模式的订阅),你可以使用 UNSUBSCRIBE
命令:
UNSUBSCRIBE channel1
这将取消对名为 channel1
的频道的订阅。
unsubscribe [channel1 [channel2...]]
- 确实,
UNSUBSCRIBE
是Redis
中用于取消订阅
一个或多个频道的命令。当你使用SUBSCRIBE
命令订阅了一个或多个频道后,你可以使用UNSUBSCRIBE
命令来停止接收这些频道上的消息。
具体语法是:
UNSUBSCRIBE [channel [channel ...]]
UNSUBSCRIBE
: 这是Redis
命令的名称,用于取消订阅频道。channel [channel ...]
: 这些是你要取消订阅的频道名称
。你可以指定一个或多个频道名称,用空格分隔。如果你不提供任何频道名称,Redis
会取消客户端对所有频道的订阅。
例如,如果你之前订阅了 news
和 weather
两个频道,现在只想取消对 news
频道的订阅,你可以使用以下命令:
UNSUBSCRIBE news
如果你想要取消对所有频道的订阅,只需运行 UNSUBSCRIBE
命令而不带任何参数:
UNSUBSCRIBE
执行 UNSUBSCRIBE
命令后,你将不再接收指定频道上的任何新消息。如果你之后想要重新订阅这些频道,你需要再次使用 SUBSCRIBE
命令。
pubsub subcommand argument1 [argument2...]
- 在
Redis
中,PUBSUB
命令用于查看订阅与发布系统的状态
,它并不是一个用于发布或订阅消息的命令,而是用于查询与发布/订阅相关的信息
。PUBSUB
命令后面跟的subcommand
决定了查询的具体内容,而argument1 [argument2...]
是与subcommand
相关的参数。
Redis
的 PUBSUB
命令支持以下子命令(subcommand
):
-
PUBSUB channels [pattern]
: 列出当前服务器中所有活跃的频道,如果提供了pattern
参数,则只列出与模式匹配的频道。 -
PUBSUB numpat
: 返回客户端当前订阅的模式数量。 -
PUBSUB numsub [channel1 channel2 ... ]
: 返回指定频道当前的订阅者数量。如果没有指定频道,则返回所有频道的订阅者数量。
下面是一些使用 PUBSUB
命令的例子:
-
列出所有活跃的频道(假设没有任何模式匹配):
127.0.0.1:6379> pubsub channels
-
列出与模式
chat*
匹配的频道:127.0.0.1:6379> pubsub channels chat*
-
返回客户端当前订阅的模式数量:
127.0.0.1:6379> pubsub numpat
-
返回频道
news
和weather
的订阅者数量:127.0.0.1:6379> pubsub numsub news weather
请注意,PUBSUB
命令主要用于调试和监控,而不是用于常规的发布/订阅操作。如果你想要发布消息到某个频道,应该使用 PUBLISH
命令;如果你想要订阅某个频道或模式,应该使用 SUBSCRIBE
或 PSUBSCRIBE
命令。
示例1
- 在
Redis
中,订阅(subscribe
)和发布(publish
)是基于发布/订阅(pub/sub)模式的。在这种模式下,发布者(publisher
)发送消息到特定的频道(channel
),而订阅者(subscriber
)则监听这些频道并接收发布的消息。
要创建一个 Redis 订阅
,你需要使用 Redis 的客户端
库或命令行工具。以下是使用 Redis 命令行
工具进行订阅的基本步骤:
- 启动 Redis 客户端
打开命令行或终端,并启动 Redis 客户端
。如果你已经配置了 Redis 服务器
并正在运行,你可以简单地键入 redis-cli
来启动客户端。
2. 订阅频道
使用 subscribe
命令来订阅一个或多个频道。例如,要订阅名为 mychannel
的频道,你可以输入:
127.0.0.1:6379> subscribe mychannel1 mychannel2
Redis
客户端会返回一个确认消息,告诉你已经成功订阅了该频道,并等待接收消息。
3. 在另一个 Redis 客户端或程序中发布消息
同时,在另一个 Redis
客户端或程序中,你可以使用 PUBLISH
命令向该频道发布消息。例如:
127.0.0.1:6379> publish mychannel1 "Hello, Redis subscribers!"
所有订阅了 mychannel
的客户端都会收到这条消息。
4. 接收消息
回到你之前订阅的 Redis
客户端,你会看到类似以下的输出:
1) "subscribe"
2) "mychannel"
3) (integer) 1
1) "message"
2) "mychannel"
3) "Hello, Redis subscribers!"
- 第一行是确认你已经订阅了
mychannel
的消息。接下来的行是接收到的实际消息,包括频道名和消息内容。
- 取消订阅
要取消订阅并退出监听模式,你可以使用 UNSUBSCRIBE
命令。例如,要取消订阅 mychannel
并退出监听模式,你可以输入:
127.0.0.1:6379> unsubscribe mychannel2
1) "unsubscribe"
2) "mychannel2"
3) (integer) 0
或者,如果你想要取消订阅所有频道并退出监听模式,只需输入:
127.0.0.1:6379> unsubscribe
1) "unsubscribe"
2) (nil)
3) (integer) 0
- 查看订阅状态
127.0.0.1:6379> pubsub channels #查看所有订阅
1) "mychannel2"
2) "mychannel1"
- 查看订阅数量
127.0.0.1:6379> pubsub numpat
(integer) 2
- 返回指定频道当前的订阅者数量
127.0.0.1:6379> pubsub numsub mychannel1 mychannel2
1) "mychannel1"
2) (integer) 1
3) "mychannel2"
4) (integer) 1
示例2
以下实例演示了发布订阅是如何工作的。在我们实例中我们创建
了订阅频道名为 redisChat
:
127.0.0.1:6379> SUBSCRIBE redisChat
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "redisChat"
3) (integer) 1
现在,我们先重新开启个 redis 客户端
,然后在同一个频道 redisChat
发布两次
消息,订阅者就能接收到消息。
127.0.0.1:6379> PUBLISH redisChat "send message"
(integer) 1
127.0.0.1:6379> PUBLISH redisChat "hello world"
(integer) 1
然后切换到前一个客户端,就可以看到如下信息:
127.0.0.1:6379> SUBSCRIBE redisChat
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "redisChat"
3) (integer) 1
# 订阅者的客户端显示如下
1) "message"
2) "redisChat"
3) "send message"
1) "message"
2) "redisChat"
3) "hello world"