Redis 支持简易的 publish/subscribe (发布/订阅)模式,简称 PubSub。
在 publish/subscribe 模式中,主要有三个部分组成:
发布者一旦向某个频道发送消息,订阅了该频道的多个订阅者,都能立马收到消息。但订阅者无法获取在它订阅之前,就已经产生的消息。
publish 用于发布消息到指定的通道(频道),返回该通道当前在线的订阅数
语法:publish channel message
# 发布消息到 ch1
127.0.0.1:6379> publish ch1 c1_test1
(integer) 2# 发布消息到 ch2
127.0.0.1:6379> publish ch2 c2_test2
(integer) 1
subscribe 用于订阅一个或多个指定的通道
语法:subscribe channel [channel ...]
# 订阅通道 ch1
127.0.0.1:6379> subscribe ch1
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "ch1"
3) (integer) 1
127.0.0.1:6379> subscribe ch1 ch2
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "ch1"
3) (integer) 1
1) "subscribe"
2) "ch2"
3) (integer) 2
psubscribe 用于订阅一个或多个符合指定模式的通道
语法:psubscribe pattern [pattern ...]
# 订阅以 ch 开头的通道
127.0.0.1:6379> psubscribe ch*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "ch*"
3) (integer) 1
unsubscribe 用于退订一个或多个指定的通道
语法:unsubscribe [channel [channel ...]]
punsubscribe 用于退订一个或多个符合指定模式的通道
语法:punsubscribe [pattern [pattern ...]]
pubsub 查看发布/订阅的系统状态
语法:pubsub subcommand [argument [argument ...]]
# 返回当前活跃的通道,即有客户端在线订阅的通道
127.0.0.1:6379> pubsub channels
1) "ch2"
2) "ch1"# 返回 ch1、ch2 当前在线的订阅数
127.0.0.1:6379> pubsub numsub ch1 ch2
1) "ch1"
2) (integer) 2
3) "ch2"
4) (integer) 1
利用 Redis 的 publish/subscribe 模式来做日志收集和处理。
需要注意的是,publish/subscribe 模式中的消息不是持久化的,这些消息也不会保存到 Redis 的 db 库。而且,如果某一个订阅者中途掉线,掉线期间的消息对于它来说就丢失了。
如果对消息的完整性有较高的要求,推荐使用更为专业的消息队列中间件,比如 kafka、rabbitmq 等。
我们知道,Redis 基于 list 可实现简易的消息队列,比如采用 lpush + brpop 命令的方式。