Skip to content

8. 发布订阅

8.1 Pub/Sub 模式

📻 比喻:Pub/Sub 就像广播电台——订阅频道的人(SUBSCRIBE)都能收到同一份广播(PUBLISH),但如果你不在收听,消息就错过了。

打开两个 redis-cli 终端:

bash
# 终端 A:订阅频道
SUBSCRIBE news:tech news:sports
bash
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "news:tech"
3) (integer) 1
1) "subscribe"
2) "news:sports"
3) (integer) 2
bash
# 终端 B:发布消息
PUBLISH news:tech "Redis 7.4 正式发布!支持新特性..."
PUBLISH news:sports "2024 年欧洲杯决赛结果出炉"
bash
(integer) 1
(integer) 1
bash
# 终端 A 收到消息:
1) "message"
2) "news:tech"
3) "Redis 7.4 正式发布!支持新特性..."
1) "message"
2) "news:sports"
3) "2024 年欧洲杯决赛结果出炉"
bash
# 模式订阅(通配符)
PSUBSCRIBE news:*

# 取消订阅
UNSUBSCRIBE news:tech
PUNSUBSCRIBE news:*

⚠️ 注意: Pub/Sub 的消息不持久化!如果订阅者掉线,期间发布的消息将丢失。需要可靠消息传递请使用Stream。

8.2 Stream 消息队列(可靠版)

相比 Pub/Sub,Stream 的优势:消息持久化、消费者组、ACK 确认机制、支持回溯消费。

bash
# 创建消费者组
XGROUP CREATE orders order_group 0 MKSTREAM

# 生产者:发送订单消息
XADD orders * order_id "ORD_1001" product "手机" amount 4999
XADD orders * order_id "ORD_1002" product "耳机" amount 299
XADD orders * order_id "ORD_1003" product "手表" amount 1999

# 消费者 1 消费
XREADGROUP GROUP order_group worker1 COUNT 2 STREAMS orders >

# 消费者 2 消费
XREADGROUP GROUP order_group worker2 COUNT 2 STREAMS orders >

# 确认消息已处理
XACK orders order_group "1704067200000-0"

# 查看 Stream 信息
XINFO STREAM orders
bash
OK
"1704067200000-0"
"1704067200100-1"
"1704067200200-2"
1) 1) "orders"
   2) 1) 1) "1704067200000-0"
         2) 1) "order_id"
            2) "ORD_1001"
            3) "product"
            4) "手机"
            5) "amount"
            6) "4999"
      2) 1) "1704067200100-1"
         2) 1) "order_id"
            2) "ORD_1002"
            3) "product"
            4) "耳机"
            5) "amount"
            6) "299"
1) 1) "orders"
   2) 1) 1) "1704067200200-2"
         2) 1) "order_id"
            2) "ORD_1003"
            3) "product"
            4) "手表"
            5) "amount"
            6) "1999"
(integer) 1
1) "length"
2) (integer) 3
3) "first-entry"
4) 1) "1704067200000-0"
   2) ...
5) "last-entry"
6) 1) "1704067200200-2"
   2) ...