Redis Streams
Redis Streams (Redis 5.0, 2018) — append-only лог внутри Redis. Похож на Kafka, но проще и в одном инстансе Redis. Persistent, consumer groups, replay. Основа multi-worker очередей.
Основные команды
# добавить
XADD mystream * field1 value1 field2 value2
→ 1633024800000-0 ← ID (ms-timestamp - seq)
# читать с начала
XRANGE mystream - +
# blocking read
XREAD BLOCK 5000 STREAMS mystream $
# $ = только новые
Consumer groups
# создать группу
XGROUP CREATE mystream billing $ MKSTREAM
# читать в группе — сообщение уйдёт одному в группе
XREADGROUP GROUP billing worker-1 COUNT 10 BLOCK 5000 STREAMS mystream >
# ack после обработки
XACK mystream billing 1633024800000-0
# просмотреть pending (не acknowledged)
XPENDING mystream billing
# claim зависших (после падения worker)
XCLAIM mystream billing worker-2 60000 1633024800000-0
Как модель
stream "orders":
1633024800000-0: {order_id:1, amount:100}
1633024800001-0: {order_id:2, amount:250}
1633024800001-1: {order_id:3, amount:50} ← совпал ms, seq=1
...
group "billing":
worker-1 → next id 1633024800002-0
pending list: [1633024800001-0 → worker-2, delivered 5с назад]
[1633024800001-1 → worker-3, delivered 8с назад]
Trim
# оставить последние N
XADD mystream MAXLEN 10000 * key val
XADD mystream MAXLEN ~ 10000 * key val # approximate, дешевле
# по времени
XTRIM mystream MINID (1633020000000
Sanity limits
- Redis single-thread → 100k-1M msg/s на инстанс
- Persistence через RDB/AOF, не отдельный лог
- Не для терабайт архива (используй Kafka)
- Cluster: stream принадлежит одному slot
Redis Streams vs Kafka
| Redis Streams | Kafka | |
|---|---|---|
| Deploy | redis-server | Kafka+ZK/KRaft, JVM |
| Retention | MAXLEN / MINID | time/size |
| Throughput | 100k/s | 1M+/s |
| Consumer group | да | да |
| Replay by offset | да | да |
| Partitions | 1 per stream | N per topic |
Когда брать
- Уже есть Redis, не хочется поднимать Kafka
- Небольшие объёмы, простая семантика
- Task queues с ack (замена BullMQ, Sidekiq)