Redis 发布订阅

面试官问:"Redis 的发布订阅怎么用?"

小陈说:"PUBLISH 和 SUBSCRIBE。"

面试官追问:"Pub/Sub 和消息队列有什么区别?"

小陈说:"...都是发消息的?"

面试官继续追问:"Pub/Sub 消息会持久化吗?"

小陈答不上来。

Redis Pub/Sub 是 Redis 的消息发布订阅机制。这道题能说清楚 Pub/Sub vs 消息队列的区别的候选人,对 Redis 的消息通信机制有实战理解。

一、Pub/Sub 基础 🔴

1.1 基本用法

-- 订阅者:订阅频道
SUBSCRIBE channel1 channel2
# 进入订阅模式,只能执行订阅/退订命令

-- 发布者:发送消息
PUBLISH channel1 "Hello World"
# 返回:订阅者数量

-- 退订
UNSUBSCRIBE channel1

1.2 模式订阅

-- 订阅匹配模式
PSUBSCRIBE news.* news.tech.*

-- 消息格式(模式订阅)
-- PUBLISH news.tech "Redis 8.0 发布"
-- 收到:news.tech "Redis 8.0 发布"

-- 退订模式
PUNSUBSCRIBE news.*

二、Pub/Sub vs 消息队列 🟡

2.1 核心区别

维度Pub/Sub消息队列
消息持久化❌ 无✅ 支持
离线消息❌ 丢失✅ 保留
消息确认❌ 无✅ ACK
消息堆积❌ 无法处理✅ 支持
消息顺序✅ 有序✅ 有序
广播✅ 原生支持✅ 支持(但配置多)

2.2 Pub/Sub 的局限性

-- Pub/Sub 的问题:
-- 1. 消息不持久化
--    发布时如果没有订阅者,消息丢失
-- 2. 不支持消息堆积
--    订阅者处理速度慢,消息直接丢弃
-- 3. 没有消息确认
--    发布者不知道订阅者是否收到

2.3 ❌ 错误示范

候选人原话:"Redis Pub/Sub 就是消息队列。"

问题诊断:Pub/Sub 和消息队列是不同的。Pub/Sub 是广播模式,无持久化;消息队列(如 Kafka/RabbitMQ)有持久化、消息确认、堆积处理。

【面试官心理】 这道题我会问"如果订阅者挂了没收到消息怎么办"。能说清楚 Pub/Sub 无持久化的候选人才是真正理解了这个机制。

三、Redis Streams 🟢

3.1 Redis Streams 简介

-- Redis 5.0 引入 Streams
-- 弥补 Pub/Sub 的不足

-- 创建流
XADD mystream * field1 value1 field2 value2
# * 表示自动生成 ID

-- 消费组
XGROUP CREATE mystream mygroup $

-- 读取
XREADGROUP GROUP mygroup consumer1 COUNT 10 STREAMS mystream ">"

3.2 Streams vs Pub/Sub

维度Pub/SubStreams
消息持久化
消息确认
消息堆积
广播✅(Consumer Group)

【面试官心理】 Redis Streams 是 Redis 5.0 的新特性。能说清楚 Streams 弥补了 Pub/Sub 哪些不足的候选人,说明他对 Redis 的消息机制有完整理解。


级别考察重点期望回答
P5基本用法PUBLISH/SUBSCRIBE
P6局限性无持久化、消息丢失
P7演进Streams 弥补了什么