Redis Streams 是 Redis 5.0 引入的一种新的数据结构,用于处理消息队列和日志数据。Streams 提供了一种高效、持久化的方式来存储和处理消息,支持多种消费模型和消息传递模式。以下是对 Redis Streams 的详细介绍,包括其基本概念、命令和使用场景。
基本概念
- Stream:一个有序的日志(log)数据结构,可以存储多个消息。
- Message:每条消息是一个键值对的集合,称为字段-值对(field-value pairs)。
- Consumer Group:一组消费者,可以共同消费一个 Stream 中的消息。
- Consumer:属于某个 Consumer Group 的消费者,负责处理消息。
- Pending Entries List (PEL):记录每个 Consumer Group 中尚未确认的消息。
基本命令
1. 创建和添加消息
- XADD:向 Stream 中添加一条消息。
XADD mystream MAXLEN 100 * sensor-id 1234 temperature 19.8mystream:Stream 的名称。MAXLEN 100:限制 Stream 的最大长度为100条消息。*:自动生成消息ID。sensor-id 1234 temperature 19.8:消息的内容,键值对形式。
2. 读取消息
-
XREAD:读取一个或多个 Stream 中的消息。
XREAD COUNT 2 BLOCK 5000 STREAMS mystream 0COUNT 2:最多读取2条消息。BLOCK 5000:如果当前没有消息,等待5000毫秒。STREAMS mystream 0:从mystream中读取ID大于0的消息。
-
XREADGROUP:从 Consumer Group 中读取消息。
XREADGROUP GROUP mygroup myconsumer COUNT 2 STREAMS mystream >GROUP mygroup myconsumer:指定 Consumer Group 和 Consumer。COUNT 2:最多读取2条消息。STREAMS mystream >:从mystream中读取未被其他消费者处理的消息。
3. 确认消息
- XACK:确认消息已被处理。
XACK mystream mygroup 1526922289062-0mystream:Stream 的名称。mygroup:Consumer Group 的名称。1526922289062-0:消息ID。
4. 删除消息
- XDEL:删除一条或多条消息。
XDEL mystream 1526922289062-0mystream:Stream 的名称。1526922289062-0:消息ID。
5. 查看待处理消息
- XPENDING:查看 Consumer Group 中待处理的消息。
XPENDING mystream mygroupmystream:Stream 的名称。mygroup:Consumer Group 的名称。
使用场景
- 消息队列:Redis Streams 可以用作消息队列,支持发布/订阅模式和竞争消费模式。
- 日志聚合:用于收集和处理日志数据,支持高效的数据存储和查询。
- 实时数据分析:用于实时处理和分析数据流,支持高吞吐量和低延迟。
- 事件溯源:用于记录和回溯系统事件,支持事件的持久化和审计。
示例
创建和添加消息
XADD mystream * sensor-id 1234 temperature 19.8
XADD mystream * sensor-id 1235 temperature 20.1
读取消息
XREAD COUNT 2 STREAMS mystream 0
创建 Consumer Group 并读取消息
XGROUP CREATE mystream mygroup 0 MKSTREAM
XREADGROUP GROUP mygroup myconsumer COUNT 2 STREAMS mystream >
确认消息
XACK mystream mygroup 1526922289062-0
查看待处理消息
XPENDING mystream mygroup