主题
面试速答(先看这里)
**一句话结论:**Redis Stream 是 Redis 5.0 版本新增加的数据结构,主要用于处理有序的、可追溯的消息流。
60秒标准回答:
Redis Stream 是 Redis 5.0 版本新增加的数据结构,主要用于处理有序的、可追溯的消息流
Stream数据结构可以被视为一个日志或消息队列,其中每个消息都有一个唯一的ID,并且按照添加的顺序进行排序。开发人员可以向Stream中添加消息、读取消息、删除消息以及订阅消息。Stream数据结构还支持消费者组,可以让多个消费者并发地处理消息流
在Redis 5.0之前,通过Redis的发布订阅 (pub/sub) 可以实现消息队列的功能,但它有个缺点就是消息无法持久化,如果出现网络断开、Redis 宕机等,消息就会被丢弃
**答题顺序:**结论 → 原理/机制 → 关键流程 → 场景与取舍 → 易错点
回答主线:
- **要点1:**Stream数据结构可以被视为一个日志或消息队列,其中每个消息都有一个唯一的ID,并且按照添加的顺序进行排序。
- **要点2:**在Redis 5.0之前,通过Redis的发布订阅 (pub/sub) 可以实现消息队列的功能,但它有个缺点就是消息无法持久化,如果出现网络断开、Redis 宕机等,消息就会被丢弃。
- **要点3:**而 Redis Stream 提供了消息的持久化和主备复制功能,可以让任何客户端访问任何时刻的数据,并且能记住每一个客户端的访问位置,还能保证消息不丢失。
- **要点4:**消息分组 :Stream支持消息分组功能,可以将消息分配到不同的消费组中,从而实现更灵活的消息消费。
- **要点5:**Stream底层采用了类似于日志的 数据结构 ,每个Stream都是由一个或多个日志实现的。
**记忆锚点:**Stream → Redis → 数据结构 → 缺点就是消息无法持久化 → 版本新增加的数据结构 → 为一个日志或消息队列
易错提醒:
- 消费者可以使用XACK命令来确认已经消费的消息,避免消息被重复消费。
加分表达:
- 在Redis 5.0之前,通过Redis的发布订阅 (pub/sub) 可以实现消息队列的功能,但它有个缺点就是消息无法持久化,如果出现网络断开、Redis 宕机等,消息就会被丢弃。
追问准备:
- 围绕「Stream」:底层原理是什么?使用时有哪些边界和常见坑?
- 围绕「Redis」:底层原理是什么?使用时有哪些边界和常见坑?
- 围绕「数据结构」:底层原理是什么?使用时有哪些边界和常见坑?
- 如果线上出现异常,你会如何定位、验证并规避?
典型回答
Redis Stream 是 Redis 5.0 版本新增加的数据结构,主要用于处理有序的、可追溯的消息流。
Stream数据结构可以被视为一个日志或消息队列,其中每个消息都有一个唯一的ID,并且按照添加的顺序进行排序。开发人员可以向Stream中添加消息、读取消息、删除消息以及订阅消息。Stream数据结构还支持消费者组,可以让多个消费者并发地处理消息流。
在Redis 5.0之前,通过Redis的发布订阅 (pub/sub) 可以实现消息队列的功能,但它有个缺点就是消息无法持久化,如果出现网络断开、Redis 宕机等,消息就会被丢弃。
而 Redis Stream 提供了消息的持久化和主备复制功能,可以让任何客户端访问任何时刻的数据,并且能记住每一个客户端的访问位置,还能保证消息不丢失。
他的特点是支持持久化、消息具有有序性,并且支持分组。主要可以用来做消息队列、日志收集、实时数据处理和聊天室应用等。
有序性:消息可以按照发布时间排序,消费者可以按照消息发布的时间顺序进行消费。
多消费者支持:多个消费者可以订阅同一个Stream并独立消费消息,支持竞争式消费和共享式消费两种消费模式。
持久化:Stream支持消息持久化,即使Redis服务器重启或崩溃,之前的消息仍然可以恢复。
消息分组:Stream支持消息分组功能,可以将消息分配到不同的消费组中,从而实现更灵活的消息消费。
扩展知识
实现原理
Stream底层采用了类似于日志的数据结构,每个Stream都是由一个或多个日志实现的。每个日志包含多个消息,每个消息包含一个唯一的ID和一些附加的字段,如消息体、时间戳等。
Redis提供了一系列的Stream命令,用于创建Stream、发布/消费消息。

当一个消息被发布到Stream中时,它将被写入Stream日志中,每个消息都有一个唯一的ID和一些可选的字段,如时间戳、消息体等。消息ID是自动分配的,可以使用自然数或UUID作为ID。
当一个消费者订阅了一个Stream并开始消费消息时,它可以使用XREAD命令从Stream中读取消息。消费者可以使用XGROUP命令将自己加入到一个消费组中,并使用XREADGROUP命令从该组中读取消息。消费者可以使用XACK命令来确认已经消费的消息,避免消息被重复消费。
他还支持消息分组的功能,当一个消费组被创建时,它将与一个Stream相关联,并包含一个消费组名称和一个偏移量。消费组可以有多个消费者,消费者可以独立地从Stream中读取消息。当一个消费者开始消费消息时,它将记录当前的消费偏移量,并在处理完所有消息后将其更新到消费组中。消费组可以使用XPENDING命令查找未确认的消息,从而处理消息的超时和未确认情况。