# XREADGROUP

## Syntax

```
XREADGROUP GROUP group consumer [COUNT count] [BLOCK milliseconds] [CLAIM min-idle-time] [NOACK] STREAMS key [key ...] id [id ...]
```

## Client

- Python (redis-py)
- Node.js (node-redis)
- Java-Sync (Jedis)
- Lettuce-Sync
- Java-Async (Lettuce)
- Java-Reactive (Lettuce)
- Go (go-redis)
- C#-Sync (NRedisStack)
- C#-Async (NRedisStack)
- PHP (Predis)
- Rust-Sync (redis-rs)
- Rust-Async (redis-rs)

## Example Code

```python
xreadgroup(
    groupname: str,
    consumername: str,
    streams: Dict[KeyT, StreamIdT],
    count: Optional[int] = None,
    block: Optional[int] = None,
    noack: bool = False,
    claim_min_idle_time: Optional[int] = None
) → ResponseT
```

## Notes

Available since: Redis Open Source 5.0.0  
Time complexity: For each stream mentioned: O(M) with M being the number of elements returned.  
ACL categories: `@write`, `@stream`, `@slow`, `@blocking`.

## Usage Example

Normally you use the command like that in order to get new messages and process them. In pseudo-code:

```
WHILE true
    entries = XREADGROUP GROUP $GroupName $ConsumerName BLOCK 2000 COUNT 10 STREAMS mystream >
    if entries == nil
        puts "Timeout... try again"
        CONTINUE
    end

FOREACH entries AS stream_entries
        FOREACH stream_entries as message
            process_message(message.id,message.fields)

# ACK the message as processed
            XACK mystream $GroupName message.id
        END
    END
END
```

In this way the example consumer code will fetch only new messages, process them, and acknowledge them via [`XACK`](/content/docs/latest/commands/xack/index.html). However, the example code above is not complete, because it does not handle recovering after a crash.

## Differences between XREAD and XREADGROUP

- The difference is that `XREADGROUP` supports consumer groups.
- Without consumer groups, all clients get all the entries arriving in a stream.
- With consumer groups, it's possible to create groups of clients consuming different parts of the messages arriving in a stream.

## Ordering Guarantees

Within each stream, entries are reported in the same order they were added by `XADD` (older first). When not blocked, across streams, entries are reported in the order the streams were specified.
