Redis 教程:发布订阅模式详解

· Redis笔记 Redis redis-cli 缓存 入门笔记 NoSQL · 4 阅读 · 约 3 分钟

什么是发布订阅

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 等方案