Appearance
redis发布/订阅
redis-cli
- publish/subscribe
redis 的 发布订阅命令是 publish
和 subscribe
命令, 在 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的, 不论服务部署了多少个实例,都可以接收到订阅