# 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`.

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

Run `redis-cli` inside the newly created redis container.

```bash
➜ 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.

```bash
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.

```bash
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

* <https://redis.io/docs/latest/develop/data-types/streams/>
* <https://www.docker.com/blog/how-to-use-the-redis-docker-official-image/>
