Redis 的 SUBSCRIBE
命令用于订阅一个或多个频道,以便接收发送到这些频道的消息。这是 Redis 实现发布/订阅(Pub/Sub)功能的核心命令之一。
基本语法
SUBSCRIBE channel [channel ...]
channel
:要订阅的频道名称,可以同时指定多个频道
工作原理
- 当客户端执行
SUBSCRIBE
命令后,会进入订阅模式 - 之后客户端只能接收订阅相关的命令(如
SUBSCRIBE
、UNSUBSCRIBE
、PSUBSCRIBE
、PUNSUBSCRIBE
) - 当有其他客户端通过
PUBLISH
命令向订阅的频道发送消息时,订阅者会收到这些消息
示例
- 首先,客户端1订阅 “news” 频道:
127.0.0.1:6379> SUBSCRIBE news
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "news"
3) (integer) 1
- 然后,客户端2向 “news” 频道发布消息:
127.0.0.1:6379> PUBLISH news "Breaking news: Redis is awesome!"
(integer) 1
- 此时客户端1会收到消息:
1) "message"
2) "news"
3) "Breaking news: Redis is awesome!"
消息格式
订阅者收到的消息是一个数组,包含三个元素:
- 消息类型:“message” 表示普通消息
- 消息来源的频道名称
- 实际的消息内容
相关命令
PUBLISH
:向指定频道发送消息UNSUBSCRIBE
:取消订阅一个或多个频道PSUBSCRIBE
:订阅符合指定模式的频道(支持通配符*
)PUNSUBSCRIBE
:取消订阅符合指定模式的频道
Python 示例
以下是使用 Python 的 redis 库实现订阅功能的示例:
import redis
import threading
def subscribe_to_channel(channel):
r = redis.Redis(host='localhost', port=6379, db=0)
pubsub = r.pubsub()
pubsub.subscribe(channel)
print(f"Subscribed to {channel} channel. Waiting for messages...")
for message in pubsub.listen():
if message['type'] == 'message':
print(f"Received message: {message['data'].decode()} from channel: {message['channel'].decode()}")
# 启动订阅线程
thread = threading.Thread(target=subscribe_to_channel, args=('news',))
thread.start()
使用 SUBSCRIBE
命令可以轻松实现基于 Redis 的消息通知系统,适用于实时通信、事件通知等场景。