8. 发布订阅
8.1 Pub/Sub 模式
📻 比喻:Pub/Sub 就像广播电台——订阅频道的人(SUBSCRIBE)都能收到同一份广播(PUBLISH),但如果你不在收听,消息就错过了。
打开两个 redis-cli 终端:
bash
# 终端 A:订阅频道
SUBSCRIBE news:tech news:sportsbash
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "news:tech"
3) (integer) 1
1) "subscribe"
2) "news:sports"
3) (integer) 2bash
# 终端 B:发布消息
PUBLISH news:tech "Redis 7.4 正式发布!支持新特性..."
PUBLISH news:sports "2024 年欧洲杯决赛结果出炉"bash
(integer) 1
(integer) 1bash
# 终端 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 ordersbash
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) ...