Skip to content

redis发布/订阅

redis-cli

  • publish/subscribe

redis 的 发布订阅命令是 publishsubscribe 命令, 在 redis-cli 下就可以实现类似功能
首先打开两个 shell,接着每个 shell 执行以下命令

subscribe abc abcd

这个命令意思是 订阅 abc 和 abcd 的 channel 的消息

publish abc "Hello world!"

发布"Hello world" 消息到 abc 频道, 这样上一个 shell 命令行就能收到对应的 "Hello wrold" 消息了

  • psubscribe

有时候 channel 有一定的规律,可以使用通配符来订阅 channel, 下面是通配符的规则

  • *:匹配多个字符(不包括分隔符)
  • ?:匹配一个字符(不包括分隔符)
  • []:匹配括号中的任意一个字符
  • [^]:匹配不在括号中的任意一个字符

这里的 p 就是 pattern 的意思, 上面 subscribe abc abcd 可以简写成下面的命令

subscribe abc*

订阅/发布在 node 中的应用

使用 ioredis 演示用法, 需要注意的是相同的 redis connection 是无法进行发布订阅的,必须在跨 process 的情况下。
订阅又分两个函数来分别处理订阅和消息,其中一个方法是 subscribe, 用来订阅频道,但是不负责接收 message, 另一个是 on('message',....) 才是真正接收 message 的方法。

请注意

publish发布的内容必须是字符串或者Buffer

js
const Redis = require("ioredis");
// 默认连接本地 redis,无密码
const redisPub = new Redis();
const redisSub = new Redis();
const channel = "abc";

redisSub.subscribe(channel);
redisSub.on("message", (channel, msg) => {
  console.log(channel, msg);
});

setInterval(() => {
  redisPub.publish(channel, new Date().getTime());
}, 1000);

下面是psubscribe的应用, 发布依然使用publish,接收的事件是 pmessage

js
const Redis = require("ioredis");
// 默认连接本地 redis,无密码
const redisPub = new Redis();
const redisSub = new Redis();

const channel = "abc";
const pchannel = "abc*";

redisSub.psubscribe(pchannel);
redisSub.on("pmessage", (pattern, channel, msg) => {
  console.log(pattern, channel, msg);
});

setInterval(() => {
  redisPub.publish(channel, new Date().getTime());
}, 1000);

redis的这种订阅发布模式,是全局并且跨服务跨pods的, 不论服务部署了多少个实例,都可以接收到订阅