# Redis 8.10

```json metadata
{
  "title": "Redis 8.10",
  "description": "What's new in Redis 8.10",
  "categories": ["docs","operate","rs","rc"],
  "tableOfContents": {"sections":[{"id":"supported-operating-systems","title":"Supported operating systems"},{"id":"security-fixes","title":"Security fixes"},{"children":[{"id":"compact-hashes","title":"Compact hashes"},{"id":"backup-command","title":"BACKUP command"},{"id":"list-multi-element-moves","title":"List multi-element moves"},{"id":"set-cardinality-commands","title":"Set cardinality commands"},{"id":"streams-reply-caps","title":"Streams reply caps"},{"id":"scriptrunner-command-flag","title":"SCRIPT_RUNNER command flag"},{"id":"slowlog-get-total-argument-count","title":"SLOWLOG GET total argument count"},{"id":"ftaliaslist","title":"FT.ALIASLIST"},{"id":"additional-stemmer-languages","title":"Additional stemmer languages"},{"id":"ftaggregate-collect-reducer","title":"FT.AGGREGATE COLLECT reducer"},{"id":"stricter-query-timeout-enforcement","title":"Stricter query timeout enforcement"},{"id":"jsonpath-extensions","title":"JSONPath extensions"},{"id":"time-series-range-and-query-commands","title":"Time series range and query commands"}],"id":"new-features","title":"New features"},{"children":[{"id":"core-fixes","title":"Core fixes"},{"id":"redis-search-fixes","title":"Redis Search fixes"},{"id":"json-fixes","title":"JSON fixes"},{"id":"time-series-fixes","title":"Time series fixes"},{"id":"probabilistic-fixes","title":"Probabilistic fixes"}],"id":"bug-fixes","title":"Bug fixes"},{"children":[{"id":"core-improvements","title":"Core improvements"},{"id":"redis-search-improvements","title":"Redis Search improvements"},{"id":"json-improvements","title":"JSON improvements"}],"id":"performance-and-resource-utilization-improvements","title":"Performance and resource utilization improvements"},{"id":"modules-api","title":"Modules API"},{"id":"configuration-parameters","title":"Configuration parameters"},{"id":"metrics","title":"Metrics"},{"id":"cli-tools","title":"CLI tools"}]}

,
  "codeExamples": []
}
```
Redis 8.10 introduces new features and performance improvements, building on the foundation of Redis 8.8.

This release delivers improvements across multiple areas:
- Compact hashes: a new hash encoding that reduces memory usage, plus the `HIMPORT` bulk-insertion command
- `BACKUP`: node-side backup and restore based on multi-part AOF (MP-AOF)
- `LMOVEM`, `BLMOVEM`: move multiple elements between lists
- `SUNIONCARD`, `SDIFFCARD`: get the cardinality of the union or difference of sets
- `XREAD`, `XREADGROUP`: new `MAXCOUNT` and `MAXSIZE` arguments to cap the cumulative reply
- New `SCRIPT_RUNNER` command flag for commands that execute scripts or functions
- `FT.ALIASLIST`: get all aliases for a Search index
- `FT.AGGREGATE`: new `COLLECT` reducer, plus stricter query `TIMEOUT` enforcement
- Extensive JSONPath extensions for JSON
- New Time Series commands: `TS.NRANGE`, `TS.NREVRANGE`, `TS.READ`, `TS.QUERYLABELS`
- Performance and resource utilization improvements across core, Search, and JSON
- Numerous bug fixes across core, Search, JSON, Time Series, and Probabilistic
- New Modules API events and functions
- New standalone redis-cli installation support

Below is a detailed breakdown of these updates.

## Supported operating systems

Redis 8.10 is tested on:

- Ubuntu 22.04 (Jammy Jellyfish), 24.04 (Noble Numbat), 26.04 (Resolute Raccoon)
- Rocky Linux 8.10, 9.7, 10.1
- AlmaLinux 8.10, 9.7, 10.1
- Debian 12.13 (Bookworm), Debian 13.4 (Trixie)
- Alpine 3.23
- macOS 14.8.4 (Sonoma), 15.7.4 (Sequoia), 26.3 (Tahoe) - for both Intel and ARM

## Security fixes

- Fixed an issue where a user could manipulate data read by a connection by injecting `\r\n` sequences into a Redis error reply.

## New features

### Compact hashes

Redis 8.10 introduces compact hashes (#15364), a new hash encoding that reduces memory usage by storing hash field names just once for keys that share a schema. The new [`HIMPORT`](https://redis.io/docs/latest/commands/himport/) command (#15364) provides high-throughput bulk insertion of compact hashes.

### BACKUP command

The new [`BACKUP`](https://redis.io/docs/latest/commands/backup/) command (#15441) adds a node-side implementation for backup and restore based on multi-part AOF (MP-AOF).

### List multi-element moves

The new [`LMOVEM`](https://redis.io/docs/latest/commands/lmovem/) and [`BLMOVEM`](https://redis.io/docs/latest/commands/blmovem/) commands (#15405) move multiple elements between lists in a single operation.

### Set cardinality commands

The new [`SUNIONCARD`](https://redis.io/docs/latest/commands/sunioncard/) command (#14893) returns the cardinality of the union of multiple sets, and the new [`SDIFFCARD`](https://redis.io/docs/latest/commands/sdiffcard/) command (#15278) returns the cardinality of the difference between sets, without materializing the result.

### Streams reply caps

[`XREAD`](https://redis.io/docs/latest/commands/xread/) and [`XREADGROUP`](https://redis.io/docs/latest/commands/xreadgroup/) accept new `MAXCOUNT` and `MAXSIZE` arguments (#15282) to cap the cumulative number of reply entries and the cumulative reply size.

### SCRIPT_RUNNER command flag

A new `SCRIPT_RUNNER` command flag (#15337) flags commands that execute scripts or functions.

### SLOWLOG GET total argument count

[`SLOWLOG GET`](https://redis.io/docs/latest/commands/slowlog-get/) adds a new reply argument (#15347): the total argument count for the logged command.

### FT.ALIASLIST

The new [`FT.ALIASLIST`](https://redis.io/docs/latest/commands/ft.aliaslist/) command (#Q9626) returns all aliases for an index (RED-197340).

### Additional stemmer languages

Redis Search adds stemmer support for Malay and Tagalog (#Q9052, RED-132425).

### FT.AGGREGATE COLLECT reducer

[`FT.AGGREGATE`](https://redis.io/docs/latest/commands/ft.aggregate/) gains a new `COLLECT` reducer (#Q9291) that separates remote and local reducer invocations (RED-177887).

### Stricter query timeout enforcement

[`FT.SEARCH`](https://redis.io/docs/latest/commands/ft.search/), [`FT.AGGREGATE`](https://redis.io/docs/latest/commands/ft.aggregate/), and [`FT.HYBRID`](https://redis.io/docs/latest/commands/ft.hybrid/) now enforce the query `TIMEOUT` more strictly (#Q8169, #Q8236, #Q9234, #Q9443).

The `search-on-timeout` policy now offers three options:

- `FAIL` — reject timed-out queries. With `search-workers > 0` (the default), the timeout is enforced preemptively.
- `RETURN` (default) — return best-effort partial results, without enforcing strictness during post-processing.
- `RETURN_STRICT` (new) — return best-effort partial results while enforcing the timeout through the post-processing (result) pipeline. Available when `search-workers > 0`.

Queries executed on the main thread (that is, when `search-workers` is 0) are capped by `search-max-foreground-timeout-limit` (default 60000 ms).

### JSONPath extensions

JSON adds extensive JSONPath extensions (#J1602, #J1603, #J1604, #J1607, #J1618; MOD-16274, MOD-16275):

- Projection expressions at the top level of a JSONPath query
- `==` and `!=` can now compare any literal, including array and object literals
- Filter negation operator: `!`
- `size`/`sizeof` and `empty` operators on string, array, object, and nodelist
- `in` and `nin` operators: membership test on an array and nodelist
- Operators on numbers: binary `-`, `+`, `*`, `/`, `%`, and unary `-` and `+`
- Operator on object: `~`
- `length()` function on array, object, and string
- Functions on number: `abs()`, `ceiling()`, `floor()`
- Functions on string: `match()`, `search()`
- Strings concatenation with `concat()`
- Functions on array: `first()`, `last()`, `index()`, `append()`
- Aggregation functions on array: `min()`, `max()`, `avg()`, `sum()`, `stddev()`
- Function on object: `keys()`
- Function on nodelist: `count()`
- Function on nodelist with exactly one node: `value()`
- Relations functions on array and nodelist: `subsetof()`, `anyof()`, `noneof()`

### Time series range and query commands

- The new [`TS.NRANGE`](https://redis.io/docs/latest/commands/ts.nrange/) and [`TS.NREVRANGE`](https://redis.io/docs/latest/commands/ts.nrevrange/) commands (#T2052) query a range across multiple time series and group results by timestamp (RED-149232).
- The new [`TS.READ`](https://redis.io/docs/latest/commands/ts.read/) command (#T2054) performs an optionally blocking read (RED-132421).
- The new [`TS.QUERYLABELS`](https://redis.io/docs/latest/commands/ts.querylabels/) command (#T2090) returns a list of labels and label-values (RED-132355).
- [`TS.MRANGE`](https://redis.io/docs/latest/commands/ts.mrange/) and [`TS.MREVRANGE`](https://redis.io/docs/latest/commands/ts.mrevrange/) accept a new `EXCLUDEEMPTY` argument (#T2072) to exclude series with no reported samples (RED-132536).

## Bug fixes

Redis 8.10 includes a broad set of bug fixes (compared to 8.8.0).

### Core fixes

- `SORT`, `GEORADIUS`, `GEORADIUSBYMEMBER`, `XREAD`, `XREADGROUP`: ACL permission bypass (#15478).
- I/O thread busy looping for replica clients (#15329, #15467).
- Duplicate KeyMeta restoration in `RESTORE`-based AOF rewrites (#15466).
- `MEMORY USAGE` over-reports memory consumption (#15462).
- Full sync under heavy write load (#15447).
- Unit mismatch disables the FAST expire cycle stale trigger (#15412).
- Crash on `VRANDMEMBER` with `LLONG_MIN` count (#15392).
- `CONFIG SET`: crash on of TLS options in non-TLS builds (#15409).
- ACL key-name leak in BCAST client-side caching invalidations (#15371).
- Signed overflow in `BITFIELD` offset parsing (#15433).
- The select-based event loop backend enqueues registered file descriptors that `select()` did not mark ready (#15446).
- `mem_clients_normal` drift when a replica drops its cached master after a failed partial resync (#15309).
- Crash on missing module numeric config (#15357).
- In-progress atomic slot migration tasks keep running on `RM_ResetDataset` and `RM_RdbLoad` (#15377).
- NULL dereference (#15391, #15356).
- Overflow on memory unit conversions (#15390).
- `SET` does not enforce mutually exclusive `NX`/`XX` and `IF*` options (#15291).
- `CONFIG SET` does not reject duplicate arguments when using both primary name and alias (#15322).
- `LSET` out-of-range 64-bit index truncation (#15407).
- Improve RDB load robustness for streams (#15308).
- Tighter cluster bus parsing for `PING`, `PONG`, and `MEET` packets (#15263).
- Partial crash log on LoongArch architecture (#15247).
- `VADD ... CAS SETATTR`: wrong attributes count (#15270).
- Typo in `release.h` that could cause build failures.

### Redis Search fixes

- `FT.CURSOR READ`: crash after the underlying index was dropped (MOD-16703).
- `FT.SEARCH` with `LIMIT` returns too many results in cluster mode over RESP3 (MOD-16767).
- `FT.INFO` could report incorrect values for multi-value TAG fields after document updates (MOD-16745).
- `FT.INFO` reports a negative `num_records` after garbage collection on indexes with an `INDEXMISSING` field (MOD-16940).
- Vector search: crash (SIGSEGV) in FP32/L2 distance computation on x86 without AVX support (MOD-16730).
- Range query returns incomplete results when the lower bound is an excluded empty string (MOD-15897).
- `FT.AGGREGATE .. WITHCOUNT` coordinator leaks resources on timeout (MOD-16210).
- Local `FT.HYBRID` ignores `ON_TIMEOUT RETURN_STRICT` and continues execution past the deadline (MOD-16492).
- Blocked search clients trigger unnecessary query dumps, adding CPU and log overhead (MOD-16518).
- `FT.HYBRID` supports `EXPLAINSCORE`, exposing the fusion method (`RRF` or `LINEAR`) (MOD-10044).

### JSON fixes

- Wrong results when evaluating paths with recursive descent (MOD-6722, MOD-14664).
- Any literal that starts with true/false/null is interpreted as true/false/null (MOD-7266).
- Improve RDB load robustness.

### Time series fixes

- `TS.INFO`: inaccurate memory usage calculation (MOD-6409).
- Aggregation fixes (MOD-8187, MOD-16224, MOD-15565).
- Improve RDB load robustness.
- Issues after cluster topology changes.
- Error on the first cross-shard command (TLS).
- `TS.INCRBY` with `TIMESTAMP *` replication timestamp drift.

### Probabilistic fixes

- `CF.LOADCHUNK` partial replication (MOD-16050).
- Improve RDB load robustness.

## Performance and resource utilization improvements

Redis 8.10 delivers a broad set of performance improvements (compared to 8.8.0).

### Core improvements

- Optimize `lpSeek()` by validating entries only when necessary (#15376).
- Optimize wide `HSET`/`HMSET` on a fresh hash with a single batched listpack append (#15345).
- Avoid recomputing allocator fragmentation twice per cron tick (#15330, RED-200844).
- Trim excess SDS allocation in inline command parsing (#15259).
- rax memory reduction: leaf-inlining for fixed-length-key trees, improving `XREADGROUP` performance (#15256).
- Improve `RESTORE REPLACE` performance for new keys (#15397).
- Optimizes an internal memory accounting (#14704).

### Redis Search improvements

- Write operations no longer block on a read lock held throughout vector range query result collection (#Q10246, MOD-16437).
- Vector search: reduced HNSW index memory usage with one-byte per-node locks (#Q10392, MOD-16696).

### JSON improvements

- JSON memory object footprint improvements (#J1617, MOD-16608).

## Modules API

- `RedisModuleEvent_ClusterTopologyChange`: cluster topology change (#15350).
- `REDISMODULE_SUBEVENT_FORK_CHILD_*`: allow multi-threaded modules to quiesce background work before `fork()` (#15327).
- `REDISMODULE_SUBEVENT_CLUSTER_SLOT_MIGRATION_MIGRATE_MODULE_PROPAGATE_END`: inject commands after the ASM replication stream (#15373).
- `RedisModule_AddPostNotificationJobForKey`: binds deferred work to a specific key from a keyspace-notification handler (#15242).

## Configuration parameters

Redis 8.10 introduces new configuration parameters for compact hashes (#15364):

- `hash-rdb-load-min-template-entries`: minimum field count to convert a plain hash to a template during load.
- `hash-rdb-load-max-template-entries`: maximum field count for load-time conversion.
- `hash-rdb-load-template-disassembly-threshold`: minimum number of keys a converted template must end up with to be kept.

## Metrics

Redis 8.10 adds new metrics for compact hashes (#15364):

- `INFO STATS` `hash_templates`: number of distinct compact hash templates.
- `INFO STATS` `hash_template_keys`: total number of keys backed by a compact hash template.
- `INFO MEMORY` `used_memory_hash_templates`: total memory used by all compact hash templates.
- `MEMORY STATS` `hash.templates`: total memory used by all compact hash templates.
- `MEMORY USAGE <key>` reports the key's own memory plus its share of a compact hash template's cost.

## CLI tools

- Adds `--latency-percentiles <p1,p2,...>` to `--latency` / `--latency-history` for reporting user-chosen percentiles (#15352).
- `redis-cli --cluster rebalance`: CROSSSLOT error when using `-user` without `-a` (#15262).
- `redis-cli --cluster reshard` and `rebalance` now move slots with server-side atomic slot migration (#15338).

