Stream vs List in Redis: Key Differences and Usage Guide
List is a simple ordered collection of strings supporting push/pop operations, while a Stream is a log-like data structure designed for message queuing with IDs and consumer groups. Streams provide more advanced features like message persistence, IDs, and consumer tracking, unlike Lists which are simpler and faster for basic queue tasks.Quick Comparison
This table summarizes the main differences between Redis Streams and Lists.
| Feature | Redis List | Redis Stream |
|---|---|---|
| Data Type | Simple ordered list of strings | Log-like append-only message queue |
| Ordering | Strict order by insertion | Strict order with unique IDs |
| Message IDs | No IDs, just positions | Each entry has a unique ID |
| Consumer Groups | Not supported | Supported for multiple consumers |
| Use Case | Simple queues, stacks | Complex messaging, event sourcing |
| Persistence | Yes, but no message tracking | Yes, with message tracking and acknowledgment |
Key Differences
Lists in Redis are simple collections where you can add or remove elements from the head or tail. They are great for basic queue or stack patterns but lack message metadata or tracking.
Streams are more advanced. Each entry has a unique ID, allowing you to track messages precisely. Streams support consumer groups, so multiple clients can read messages independently and acknowledge processing.
This makes Streams ideal for event-driven systems, message queues, or logs where you need durability and consumer coordination. Lists are better for simple, fast operations without the overhead of tracking.
Code Comparison
Here is how you add and read messages using a Redis List.
127.0.0.1:6379> LPUSH mylist "message1" (integer) 1 127.0.0.1:6379> LPUSH mylist "message2" (integer) 2 127.0.0.1:6379> LRANGE mylist 0 -1 1) "message2" 2) "message1"
Stream Equivalent
Here is how you add and read messages using a Redis Stream.
127.0.0.1:6379> XADD mystream * message "message1" "1680000000000-0" 127.0.0.1:6379> XADD mystream * message "message2" "1680000000001-0" 127.0.0.1:6379> XRANGE mystream - + 1) 1) "1680000000000-0" 2) 1) "message" 2) "message1" 2) 1) "1680000000001-0" 2) 1) "message" 2) "message2"
When to Use Which
Choose List when you need a simple, fast queue or stack without message tracking or complex consumer coordination. Lists are perfect for lightweight tasks like job queues or temporary buffers.
Choose Stream when you need reliable message delivery, ordering with unique IDs, and support for multiple consumers with acknowledgment. Streams are best for event sourcing, messaging systems, and real-time data feeds.