Skip to main content

Redis: Streams

A Redis stream is a data structure that acts like an append-only log but also implements several operations to overcome some of the limits of a typical append-only log. We can use streams to record and simultaneously syndicate events in real time.

  • Redis generates a unique ID for each stream entry.
  • Streams keep messages in Redis for as long as you want (configurable).
  • Consumers can read at their own pace, even if they were offline.
  • We can acknowledge messages (XACK) and track delivery.

Similar like pub/sub we need A producer and consumers to implement redis streams in our system.

Basic Example

Lets create a basic example of redis streams using XADD and XREAD command.

Setup

To run redis server you can install it directly in your machine or using virtualization. For me I prefer to use docker and here is how to do it.

Run a detached container with name my-redis using latest redis image and expose the port 6379.

docker run -d -p 6379:6379 --name my-redis redis

Run redis-cli inside the newly created redis container.

➜ redis_streams docker exec -it my-redis redis-cli         
127.0.0.1:6379>

XADD

This is the simplest form of adding a message to a Redis Stream. Each message will have a unique ID and some data fields.

127.0.0.1:6379> XADD mystream * message Hello
"1740039025432-0"
  • mystream: name of the stream, redis will create the stream if not exist.
  • *: Stream ID, will auto-generate a unique ID if the ID argument specified is the *.
  • message Hello: Key value pair data, message is the key and value is Hello.

XREAD

Read data from one or multiple streams. This command has an option to block if items are not available.

127.0.0.1:6379> XREAD COUNT 1 STREAMS mystream 0
1) 1) "mystream"
2) 1) 1) "1740039025432-0"
2) 1) "message"
2) "Hello"
  • COUNT 1: Return maximum 1 element for each stream.
  • STREAMS mystream 0:
    • mystream: Name of the stream.
    • 0: Read element from the start.

References