Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
344e956
DOC-5799: search: document procedure for building with Intel binaries…
dwdougherty Oct 3, 2025
cab5aa7
DOC-5777: search: document new SCORERs (#2204)
dwdougherty Oct 3, 2025
576726b
DOC-5818: vector set: add new VRANGE command (#2233)
dwdougherty Oct 14, 2025
68ea89f
Merge branch 'main' into feat-ros-8.4
dwdougherty Oct 27, 2025
d6b44e0
DOC-5575: update the modules API page (#2305)
dwdougherty Oct 27, 2025
989cdef
DOC-5853: update CLIENT LIST history information (#2306)
dwdougherty Oct 27, 2025
55aa008
DOC-5864: update tested-on information (#2311)
dwdougherty Oct 28, 2025
a67f352
DOC-5800: search: document new vector search attrib. (#2209)
dwdougherty Oct 30, 2025
4036f61
DOC-5717: update XREADGROUP command page (#2312)
dwdougherty Nov 3, 2025
a96281f
DOC-5720: add new MSETEX command page (#2310)
dwdougherty Nov 3, 2025
4b14a68
DOC-5718: add new string commands (#2307)
dwdougherty Nov 3, 2025
4f63939
DOC-5867: add new CLUSTER MIGRATION command page (etc) (#2314)
dwdougherty Nov 3, 2025
7efe18c
DOC-5574: add 8.4-RC1 release notes (#2344)
dwdougherty Nov 4, 2025
ba8c23a
DOC-5577: update what's new page with 8.4 info (#2345)
dwdougherty Nov 4, 2025
7a43e3f
DOC-5863: update config. params pages (#2346)
dwdougherty Nov 4, 2025
7c476b9
Resolve merge conflicts
dwdougherty Nov 4, 2025
ff83351
DOC-5589: update RS/RC compat. info. for new cmds (#2352)
dwdougherty Nov 5, 2025
d61626f
Merge branch 'main' into feat-ros-8.4
dwdougherty Nov 7, 2025
88a25c7
DOC-5924: update final bits and pieces for 8.4 release (#2353)
dwdougherty Nov 7, 2025
04ff38a
DOC-5801: search: add new FT.HYBRID command (#2210)
dwdougherty Nov 7, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 13 additions & 2 deletions build/components/syntax.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,12 @@ class ArgumentType(Enum):
BLOCK = 'block'
PURE_TOKEN = 'pure-token'
COMMAND = 'command'
FUNCTION = 'function'
INDEX = 'index'
KEYNUM = 'keynum'
KEYWORD = 'keyword'
RANGE = 'range'
UNKNOWN = 'unknown'


class Argument:
Expand All @@ -28,8 +34,8 @@ def __init__(self, data: dict = {}, level: int = 0, max_width: int = 640) -> Non
self._stack = []
self._level: int = level
self._max_width: int = max_width
self._name: str = data['name']
self._type = ArgumentType(data['type'])
self._name: str = data.get('name', data.get('token', 'unnamed'))
self._type = ArgumentType(data.get('type', 'string'))
self._optional: bool = data.get('optional', False)
self._multiple: bool = data.get('multiple', False)
self._multiple_token: bool = data.get('multiple_token', False)
Expand All @@ -49,6 +55,11 @@ def syntax(self, **kwargs) -> str:
args += ' '.join([arg.syntax() for arg in self._arguments])
elif self._type == ArgumentType.ONEOF:
args += f' | '.join([arg.syntax() for arg in self._arguments])
elif self._type == ArgumentType.FUNCTION:
# Functions should display their token/name, not expand nested arguments
args += self._display
if show_types:
args += f':{self._type.value}'
elif self._type != ArgumentType.PURE_TOKEN:
args += self._display
if show_types:
Expand Down
10 changes: 9 additions & 1 deletion content/commands/client-list.md
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,12 @@ history:
- Added `resp`, `multi-mem`, `rbs` and `rbp` fields.
- - 7.0.3
- Added `ssub` field.
- - 7.2.0
- Added `lib-name` and `lib-ver` fields.
- - 7.4.0
- Added `watch` field.
- - 8.0.0
- Added `io-thread` field.
linkTitle: CLIENT LIST
since: 2.4.0
summary: Lists open connections.
Expand Down Expand Up @@ -129,9 +135,11 @@ b: the client is waiting in a blocking operation
c: connection to be closed after writing entire reply
d: a watched keys has been modified - EXEC will fail
e: the client is excluded from the client eviction mechanism
g: the client is responsible for migrating slots (atomic slot migration)
i: the client is waiting for a VM I/O (deprecated)
M: the client is a master
N: no specific flag set
o: the client is responsible for importing slots (atomic slot migration)
O: the client is a client in MONITOR mode
P: the client is a Pub/Sub subscriber
r: the client is in readonly mode against a cluster node
Expand All @@ -142,7 +150,7 @@ x: the client is in a MULTI/EXEC context
t: the client enabled keys tracking in order to perform client side caching
T: the client will not touch the LRU/LFU of the keys it accesses
R: the client tracking target client is invalid
B: the client enabled broadcast tracking mode
B: the client enabled broadcast tracking mode
```

The file descriptor events can be:
Expand Down
3 changes: 3 additions & 0 deletions content/commands/cluster-countkeysinslot.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,9 @@ command only queries the local data set, so contacting a node
that is not serving the specified hash slot will always result in a count of
zero being returned.

{{< note>}}During atomic slot migration operations (available since Redis 8.4.0), keys being imported or trimmed will be filtered out from the results.
{{< /note >}}

```
> CLUSTER COUNTKEYSINSLOT 7000
(integer) 50341
Expand Down
3 changes: 3 additions & 0 deletions content/commands/cluster-getkeysinslot.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,9 @@ node to another. The way the rehashing is performed is exposed in the Redis
Cluster specification, or in a more simple to digest form, as an appendix
of the [`CLUSTER SETSLOT`]({{< relref "/commands/cluster-setslot" >}}) command documentation.

{{< note >}}During atomic slot migration operations (available since Redis 8.4.0), keys being imported or trimmed will be filtered out from the results.
{{< /note >}}

```
> CLUSTER GETKEYSINSLOT 7000 3
1) "key_39015"
Expand Down
10 changes: 10 additions & 0 deletions content/commands/cluster-info.md
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,16 @@ total_cluster_links_buffer_limit_exceeded:0
* `cluster_stats_messages_received`: Number of messages received via the cluster node-to-node binary bus.
* `total_cluster_links_buffer_limit_exceeded`: Accumulated count of cluster links freed due to exceeding the `cluster-link-sendbuf-limit` configuration.

The following atomic slot migration fields may be included in the reply (available since Redis 8.4.0):

* `cluster_slot_migration_active_tasks`: Number of in-progress ASM tasks. Currently, it will be 1 or 0.
* `cluster_slot_migration_active_trim_running`: Number of active trim jobs in progress and scheduled.
* `cluster_slot_migration_active_trim_current_job_keys`: Number of keys scheduled for deletion in the current trim job.
* `cluster_slot_migration_active_trim_current_job_trimmed`: Number of keys already deleted in the current trim job.
* `cluster_slot_migration_stats_active_trim_started`: Total number of trim jobs that have started since the process began.
* `cluster_slot_migration_stats_active_trim_completed`: Total number of trim jobs completed since the process began.
* `cluster_slot_migration_stats_active_trim_cancelled`: Total number of trim jobs cancelled since the process began.

The following message-related fields may be included in the reply if the value is not 0:
Each message type includes statistics on the number of messages sent and received.
Here are the explanation of these fields:
Expand Down
205 changes: 205 additions & 0 deletions content/commands/cluster-migration.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,205 @@
---
acl_categories:
- '@admin'
- '@slow'
- '@dangerous'
arguments:
- arguments:
- arguments:
- display_text: start-slot
name: start-slot
type: integer
- display_text: end-slot
name: end-slot
type: integer
multiple: true
name: import
token: IMPORT
type: block
- arguments:
- display_text: task-id
name: task-id
token: ID
type: string
- display_text: all
name: all
token: ALL
type: pure-token
name: cancel
token: CANCEL
type: oneof
- arguments:
- display_text: task-id
name: task-id
optional: true
token: ID
type: string
- display_text: all
name: all
optional: true
token: ALL
type: pure-token
name: status
token: STATUS
type: block
name: subcommand
type: oneof
arity: -4
categories:
- docs
- develop
- stack
- oss
- rs
- rc
- oss
- kubernetes
- clients
command_flags:
- admin
- stale
- no_async_loading
complexity: O(N) where N is the total number of the slots between the start slot and
end slot arguments.
description: Start, monitor, and cancel atomic slot migration tasks.
group: cluster
hidden: false
linkTitle: CLUSTER MIGRATION
since: 8.4.0
summary: Start, monitor, and cancel atomic slot migration tasks.
syntax_fmt: "CLUSTER MIGRATION <IMPORT\_start-slot end-slot [start-slot end-slot ...]\n\
\ | CANCEL\_<ID\_task-id | ALL> | STATUS\_<ID\_task-id | ALL>"
syntax_str: ''
title: CLUSTER MIGRATION
---

The `CLUSTER MIGRATION` command provides atomic slot migration functionality for Redis Cluster. This command allows you to import slots from other nodes, monitor the progress of migration tasks, and cancel ongoing migrations.

## Required arguments

<details open><summary><code>subcommand</code></summary>

The subcommand specifies the operation to perform:

- `IMPORT <start-slot> <end-slot> [<start-slot> <end-slot> ...]`: Executes on the destination master. Accepts multiple slot ranges and triggers atomic migration for the specified ranges. Returns a task ID that you can use to monitor the status of the task.

- `CANCEL <ID <task-id> | ALL>`: Cancels an ongoing migration task by its ID or cancels all tasks if `ALL` is specified. Note: Cancelling a task on the source node does not stop the migration on the destination node, which will continue retrying until it is also cancelled there.

- `STATUS [ID <task-id> | ALL]`: Displays the status of current and completed atomic slot migration tasks. If a specific task ID is provided, it returns detailed information for that task only. If `ALL` is specified, it returns the status of all ongoing and completed tasks.

</details>

## Examples

Import slots 0-1000 and 2000-3000 to the current node:

```bash
CLUSTER MIGRATION IMPORT 0 1000 2000 3000
```

Check the status of all migration tasks:

```bash
CLUSTER MIGRATION STATUS ALL
```

Check the status of a specific migration task:

```bash
CLUSTER MIGRATION STATUS ID 24cf41718b20f7f05901743dffc40bc9b15db339
```

Cancel a specific migration task:

```bash
CLUSTER MIGRATION CANCEL ID 24cf41718b20f7f05901743dffc40bc9b15db339
```

Cancel all migration tasks:

```bash
CLUSTER MIGRATION CANCEL ALL
```

## Redis Software and Redis Cloud compatibility

| Redis<br />Enterprise | Redis<br />Cloud | <span style="min-width: 9em; display: table-cell">Notes</span> |
|:----------------------|:-----------------|:------|
| <span title="Not supported">&#x274c; Standard</span><br /><span title="Not supported"><nobr>&#x274c; Active-Active</nobr></span> | <span title="Not supported">&#x274c; Standard</span><br /><span title="Not supported"><nobr>&#x274c; Active-Active</nobr></span> | |

## Return information

{{< multitabs id="return-info"
tab1="RESP2"
tab2="RESP3" >}}

For the `IMPORT` subcommand:
[Bulk string reply](../../develop/reference/protocol-spec#bulk-strings): task ID on success, or error message on failure.

For the `CANCEL` subcommand:
[Integer reply](../../develop/reference/protocol-spec#integers): number of cancelled tasks.

For the `STATUS` subcommand:
[Array reply](../../develop/reference/protocol-spec#arrays): a list of migration task details. Each task is represented as an array containing field-value pairs:
- `id`: Task identifier
- `slots`: Slot range being imported or migrated
- `source`: Source node ID
- `dest`: Destination node ID
- `operation`: Operation type ("import" or "migrate")
- `state`: Current state ("completed", "in_progress", etc.)
- `last_error`: Last error message (empty if none)
- `retries`: Number of retry attempts
- `create_time`: Task creation timestamp
- `start_time`: Task start timestamp
- `end_time`: Task completion timestamp (if completed)
- `write_pause_ms`: Write pause duration in milliseconds

-tab-sep-

For the `IMPORT` subcommand:
[Bulk string reply](../../develop/reference/protocol-spec#bulk-strings): task ID on success, or error message on failure.

For the `CANCEL` subcommand:
[Integer reply](../../develop/reference/protocol-spec#integers): number of cancelled tasks.

For the `STATUS` subcommand:
[Array reply](../../develop/reference/protocol-spec#arrays): a list of migration task details. Each task is represented as an array containing field-value pairs:
- `id`: Task identifier
- `slots`: Slot range being migrated
- `source`: Source node ID
- `dest`: Destination node ID
- `operation`: Operation type (typically "migrate")
- `state`: Current state ("completed", "in_progress", etc.)
- `last_error`: Last error message (empty if none)
- `retries`: Number of retry attempts
- `create_time`: Task creation timestamp
- `start_time`: Task start timestamp
- `end_time`: Task completion timestamp (if completed)
- `write_pause_ms`: Write pause duration in milliseconds

{{< /multitabs >}}

## Notes

- The atomic slot migration feature is available starting from Redis 8.4.0.
- Cancelling a task on the source node does not automatically stop the migration on the destination node.
- In `CLUSTER MIGRATION STATUS` output, the "state" field will show `completed` for successful operations.
- Tasks with empty "last_error" fields indicate no errors occurred during the migration process.

## Key visibility during migration

During atomic slot migration operations, keys in unowned slotsmay be filtered out from the following commands while importing or trimming is in progress:

- [`KEYS`]({{< relref "/commands/keys" >}})
- [`SCAN`]({{< relref "/commands/scan" >}})
- [`RANDOMKEY`]({{< relref "/commands/randomkey" >}})
- [`CLUSTER GETKEYSINSLOT`]({{< relref "/commands/cluster-getkeysinslot" >}})
- [`DBSIZE`]({{< relref "/commands/dbsize" >}})
- [`CLUSTER COUNTKEYSINSLOT`]({{< relref "/commands/cluster-countkeysinslot" >}})

The [`INFO KEYSPACE`]({{< relref "/commands/info" >}}) command will continue to reflect the actual number of keys, including those being imported.

## Related configuration

- `cluster-slot-migration-handoff-max-lag-bytes`: After slot snapshot completion, if remaining replication stream size falls below this threshold, the source node pauses writes to hand off slot ownership. Higher values trigger handoff earlier but may cause longer write pauses. Lower values result in shorter write pauses but may be harder to reach with steady incoming writes (default: 1MB).
- `cluster-slot-migration-write-pause-timeout`: Maximum duration that the source node pauses writes during ASM handoff. If the destination fails to take over slots within this timeout, the source assumes migration failed and resumes writes (default: 10 seconds).
Loading