Skip to content
Open
Show file tree
Hide file tree
Changes from 18 commits
Commits
Show all changes
21 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
e9cdc06
Merge branch 'main' into feat-ros-8.4
dwdougherty Nov 12, 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
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).
113 changes: 113 additions & 0 deletions content/commands/delex.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
---
acl_categories:
- '@write'
- '@string'
- '@fast'
arguments:
- display_text: key
key_spec_index: 0
name: key
type: key
- arguments:
- display_text: ifeq-value
name: ifeq-value
token: IFEQ
type: string
- display_text: ifne-value
name: ifne-value
token: IFNE
type: string
- display_text: ifdeq-digest
name: ifdeq-digest
token: IFDEQ
type: integer
- display_text: ifdne-digest
name: ifdne-digest
token: IFDNE
type: integer
name: condition
optional: true
type: oneof
arity: -2
categories:
- docs
- develop
- stack
- oss
- rs
- rc
- oss
- kubernetes
- clients
command_flags:
- write
- fast
complexity: O(1) for IFEQ/IFNE, O(N) for IFDEQ/IFDNE where N is the length of the string value.
description: Conditionally removes the specified key based on value or hash digest comparison.
group: string
hidden: false
key_specs:
- RW: true
begin_search:
spec:
index: 1
type: index
delete: true
find_keys:
spec:
keystep: 1
lastkey: 0
limit: 0
type: range
linkTitle: DELEX
since: 8.4.0
summary: Conditionally removes the specified key based on value or hash digest comparison.
syntax_fmt: "DELEX key [IFEQ\_ifeq-value | IFNE\_ifne-value | IFDEQ\_ifdeq-digest\
\ |\n IFDNE\_ifdne-digest]"
syntax_str: "[IFEQ\_ifeq-value | IFNE\_ifne-value | IFDEQ\_ifdeq-digest | IFDNE\_\
ifdne-digest]"
title: DELEX
---

Conditionally removes the specified key based on value or hash digest comparison.

## Hash Digest

A hash digest is a fixed-size numerical representation of a string value, computed using the XXH3 hash algorithm. Redis uses this hash digest for efficient comparison operations without needing to compare the full string content. You can retrieve a key's hash digest using the [`DIGEST`]({{< relref "/commands/digest" >}}) command, which returns it as a hexadecimal string that you can use with the `IFDEQ` and `IFDNE` options, and also the [`SET`]({{< relref "/commands/set" >}}) command's `IFDEQ` and `IFDNE` options.

## Options

The DELEX command supports a set of options that modify its behavior.
Only one of the options can be specified.

* `IFEQ ifeq-value` -- Remove the key if the value is equal to the specified value.
* `IFNE ifne-value` -- Remove the key if the value is not equal to the specified value.
* `IFDEQ ifeq-digest` -- Remove the key if its hash digest is equal to the specified hash digest.
* `IFDNE ifne-digest` -- Remove the key if its hash digest is not equal to the specified hash digest.

In 8.4, keys must be of type string when using one of the options above. If no options are specified, the key is removed regardless of its type.

## 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" >}}

One of the following:
- [Integer reply]({{< relref "/develop/reference/protocol-spec#integers" >}}): 0 if not deleted (the key does not exist or a specified `IFEQ/IFNE/IFDEQ/IFDNE` condition is false), or 1 if deleted.
- [Simple error reply]({{< relref "/develop/reference/protocol-spec#simple-errors" >}}) if the key exists but holds a value that is not a string and one of `IFEQ, IFNE, IFDEQ,` or `IFDNE` is specified.

-tab-sep-

One of the following:
- [Integer reply]({{< relref "/develop/reference/protocol-spec#integers" >}}): 0 if not deleted (the key does not exist or a specified `IFEQ/IFNE/IFDEQ/IFDNE` condition is false), or 1 if deleted.
- [Simple error reply]({{< relref "/develop/reference/protocol-spec#simple-errors" >}}) if the key exists but holds a value that is not a string and one of `IFEQ, IFNE, IFDEQ,` or `IFDNE` is specified.

{{< /multitabs >}}
Loading