什么是发布订阅
Redis 提供了一组基于“频道(channel)”的消息通信命令,发布者把消息发到某个频道,所有订阅该频道的客户端都会收到消息。这是一种典型的“ fire-and-forget ”广播机制,Redis 不持久化这些消息,也不做 ACK 确认。
常用命令
| 命令 | 说明 |
|---|---|
SUBSCRIBE channel |
订阅一个或多个频道 |
UNSUBSCRIBE channel |
取消订阅 |
PUBLISH channel message |
向指定频道发布消息 |
PSUBSCRIBE pattern |
按模式订阅,如 news.* |
PUNSUBSCRIBE pattern |
取消模式订阅 |
命令行演示
开两个终端,分别执行:
订阅端:
redis-cli
127.0.0.1:6379> SUBSCRIBE news.sports
发布端:
redis-cli
127.0.0.1:6379> PUBLISH news.sports "hello redis"
订阅端会立刻收到类似下面的返回:
1) "message"
2) "news.sports"
3) "hello redis"
代码示例
以 PHP 为例,先发布一条消息:
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$redis->publish('news.sports', 'hello redis');
订阅端需要阻塞循环监听:
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$redis->subscribe(['news.sports'], function ($redis, $channel, $msg) {
echo "频道 {$channel} 收到消息:{$msg}\n";
});
使用注意事项
- 消息不落盘,订阅端不在线就收不到,适合通知类场景,不适合可靠队列
subscribe之后该连接进入订阅状态,只能执行订阅相关命令,所以生产中订阅要用独立连接- 需要可靠消息、阻塞队列时,可改用 Redis Stream 或 List 的
BRPOP等方案