Redis的发布订阅(Pub/Sub)是基于事件驱动的消息通信模式,支持消息的异步传递,在很多轻量级消息通知场景中都有广泛应用。下面我们通过具体示例来学习如何使用这个功能。

Redis发布订阅核心命令
Redis提供了几个核心命令来支持发布订阅功能,我们逐一了解:
SUBSCRIBE channel [channel ...]:订阅一个或多个频道,接收发送到这些频道的消息PUBLISH channel message:向指定频道发送消息,返回收到消息的订阅者数量UNSUBSCRIBE [channel ...]:退订指定的频道,如果不指定频道则退订所有已订阅的频道PSUBSCRIBE pattern [pattern ...]:订阅符合指定模式的所有频道,支持通配符匹配PUNSUBSCRIBE [pattern ...]:退订符合指定模式的频道订阅
命令行客户端演示
我们先打开两个Redis命令行客户端,一个作为订阅者,一个作为发布者,来演示基础流程。
订阅者操作
在第一个客户端中订阅news频道:
# 订阅news频道 SUBSCRIBE news # 订阅成功后会返回订阅信息,之后会阻塞等待消息
发布者操作
在第二个客户端中向news频道发送消息:
# 向news频道发送消息 PUBLISH news "今天Redis发布订阅功能更新了" # 返回1,表示有1个订阅者收到了消息
此时第一个客户端会立即收到消息:
1) "message" 2) "news" 3) "今天Redis发布订阅功能更新了"
Python客户端实现示例
实际项目中我们更多会使用编程语言客户端来操作,下面是Python使用redis-py库实现发布订阅的示例。
订阅者代码
import redis
# 连接Redis
r = redis.Redis(host='127.0.0.1', port=6379, db=0)
# 创建发布订阅对象
pubsub = r.pubsub()
# 订阅news频道
pubsub.subscribe('news')
# 循环监听消息
for message in pubsub.listen():
# 过滤订阅成功的反馈消息
if message['type'] == 'message':
print(f"收到消息:{message['data'].decode('utf-8')}")发布者代码
import redis
# 连接Redis
r = redis.Redis(host='127.0.0.1', port=6379, db=0)
# 向news频道发送消息
count = r.publish('news', 'Python客户端发送的消息')
print(f"消息发送成功,共有{count}个订阅者收到")模式订阅示例
如果需要订阅一类频道,比如所有news.开头的频道,可以使用模式订阅:
# 订阅所有news.开头的频道 PSUBSCRIBE news.* # 此时向news.sports、news.tech等频道发送消息都会被收到
适用场景与注意事项
Redis发布订阅功能适合轻量级的消息通知场景,比如简单的实时通知、轻量级聊天室等,但它也有明显的局限性:
- 消息不支持持久化,如果订阅者离线期间发送的消息,上线后无法收到
- 没有消息确认机制,发送者无法知道消息是否被成功处理
- 如果消息生产速度远快于消费速度,可能会导致消息堆积,甚至丢失
如果需要更可靠的消息队列能力,建议考虑Redis Stream或者专业的消息中间件。但对于不需要严格可靠性的简单场景,Redis发布订阅是一个轻量且易用的选择。