# Redis 8.8

```json metadata
{
  "title": "Redis 8.8",
  "description": "What's new in Redis 8.8",
  "categories": ["docs","operate","rs","rc"],
  "tableOfContents": {"sections":[{"id":"supported-operating-systems","title":"Supported operating systems"},{"id":"security-fixes","title":"Security fixes"},{"children":[{"id":"array-data-structure","title":"Array data structure"},{"id":"hash-field-level-notifications","title":"Hash field-level notifications"},{"id":"increx-rate-limiter","title":"INCREX rate limiter"},{"id":"xnack-streams-command","title":"XNACK streams command"},{"id":"sorted-set-count-aggregator","title":"Sorted set COUNT aggregator"},{"id":"jsonset-fpha-argument","title":"JSON.SET FPHA argument"},{"id":"time-series-multiple-aggregators","title":"Time series multiple aggregators"},{"id":"fthybrid-candidates-per-shard","title":"FT.HYBRID candidates per shard"},{"id":"ftprofile-hybrid","title":"FT.PROFILE HYBRID"},{"id":"in-group-sorting-reducer","title":"In-group sorting reducer"}],"id":"new-features","title":"New features"},{"children":[{"id":"core-fixes","title":"Core fixes"},{"id":"search-and-query-fixes","title":"Search and Query 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":"search-and-query-improvements","title":"Search and Query improvements"}],"id":"performance-and-resource-utilization-improvements","title":"Performance and resource utilization improvements"},{"id":"configuration-parameters","title":"Configuration parameters"},{"id":"metrics","title":"Metrics"},{"id":"cli-tools","title":"CLI tools"}]}

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

This release delivers improvements across multiple areas:
- A new Array data structure
- Subkey notification for hash fields (field-level notifications)
- `INCREX`: window counter rate limiter combining `INCR`, `INCRBY`, `INCRBYFLOAT`, bounds, and expiration
- `XNACK`: new streams command that lets consumers explicitly release pending messages
- `ZUNION`, `ZINTER`, `ZUNIONSTORE`, `ZINTERSTORE`: new `COUNT` aggregator
- `JSON.SET`: new `FPHA` argument to specify the FP type for homogeneous FP arrays
- `TS.RANGE`, `TS.REVRANGE`, `TS.MRANGE`, `TS.MREVRANGE`: multiple aggregators in a single command
- `FT.HYBRID` `KNN` clause: new argument to request fewer candidates per shard
- `FT.PROFILE` `HYBRID`: profiling support for `FT.HYBRID`
- New in-group sorting reducer - `COLLECT` for `FT.AGGREGATE`
- Substantial Search and Query performance improvements (Rust iterators, devirtualized vector hot paths, AArch64 atomics)
- HyperLogLog, `MGET`/`MSET`, and `HGETALL` performance improvements
- Numerous security fixes and bug fixes across core, Search, JSON, Time Series, and Probabilistic

Below is a detailed breakdown of these updates.

## Supported operating systems

Redis 8.8 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

Redis 8.8 includes important security fixes (compared to 8.8-M03):

- (CVE-2026-23479) Use-After-Free in unblock client flow may lead to remote code execution.
- (CVE-2026-25243) Invalid memory access in `RESTORE` may lead to remote code execution.
- (CVE-2026-23631) Lua Use-After-Free may lead to remote code execution.
- (CVE-2026-25588) Invalid memory access in `RESTORE` may lead to remote code execution (Time Series).
- (CVE-2026-25589) Invalid memory access in `RESTORE` may lead to remote code execution (Probabilistic).

## New features

### Array data structure

Redis 8.8 introduces a new Array data structure (#15162), providing a dedicated data type for ordered, indexable collections.

### Hash field-level notifications

Redis 8.8 adds subkey notifications for hash fields, enabling field-level keyspace notifications for hash data.

### INCREX rate limiter

The new [`INCREX`](https://redis.io/docs/latest/commands/increx/) command (#15045) is a window counter rate limiter that combines `INCR`, `INCRBY`, `INCRBYFLOAT`, bounds, and expiration into a single atomic operation. It simplifies common rate-limiting patterns by eliminating the need for multi-command transactions.

### XNACK streams command

The new [`XNACK`](https://redis.io/docs/latest/commands/xnack/) command allows stream consumers to explicitly release pending messages, providing finer-grained control over consumer group pending entry lists.

### Sorted set COUNT aggregator

[`ZUNION`](https://redis.io/docs/latest/commands/zunion/), [`ZINTER`](https://redis.io/docs/latest/commands/zinter/), [`ZUNIONSTORE`](https://redis.io/docs/latest/commands/zunionstore/), and [`ZINTERSTORE`](https://redis.io/docs/latest/commands/zinterstore/) support a new `COUNT` aggregator for combining sorted sets.

### JSON.SET FPHA argument

[`JSON.SET`](https://redis.io/docs/latest/commands/json.set/) accepts a new `FPHA` argument that specifies the floating-point type for homogeneous FP arrays.

### Time series multiple aggregators

[`TS.RANGE`](https://redis.io/docs/latest/commands/ts.range/), [`TS.REVRANGE`](https://redis.io/docs/latest/commands/ts.revrange/), [`TS.MRANGE`](https://redis.io/docs/latest/commands/ts.mrange/), and [`TS.MREVRANGE`](https://redis.io/docs/latest/commands/ts.mrange/) now support multiple aggregators in a single command.

### FT.HYBRID candidates per shard

The [`FT.HYBRID`](https://redis.io/docs/latest/commands/ft.hybrid/) `KNN` clause accepts a new argument to request fewer candidates per shard, reducing overhead in cluster mode.

### FT.PROFILE HYBRID

[`FT.PROFILE`](https://redis.io/docs/latest/commands/ft.profile/) adds profiling support for [`FT.HYBRID`](https://redis.io/docs/latest/commands/ft.hybrid/) queries.

### In-group sorting reducer

A new reducer for [`FT.AGGREGATE`](https://redis.io/docs/latest/commands/ft.aggregate/) allows you to unwind grouped documents after `GROUPBY` and sort them within each group, enabling more sophisticated aggregation pipelines.

## Bug fixes

Redis 8.8 includes a broad set of bug fixes (compared to 8.8-M03).

### Core fixes

- `SUBSCRIBE`, `PSUBSCRIBE`, `SSUBSCRIBE`: crash on OOM (RED-167788).
- `CONFIG SET`: some settings allow invalid characters (RED-167787).
- `SCRIPT DEBUG`: potential crash on scripts (RED-175507).
- `VADD`: crash or buffer overflow on large `REDUCE` value (RED-170921).
- `VSET`: crash on huge allocations (MOD-12678).
- `cluster-announce-ip` rejecting hostnames (regression) (#15188).
- Double free when loading streams with duplicate consumer PEL entries (#15095).
- Issues processing corrupt Streams RDB data (#15124).
- `fast_float_strtod` rounding mismatch (#15111).
- `vecClear` reset the logical size without releasing element ownership (#15190).
- `MULTI` queue incorrect memory accounting (#15163).
- Cluster crash when `CLIENT KILL` unsubscribes `SSUBSCRIBE` client inside `EXEC` (#15094).
- Listpack backlength encoding thresholds off-by-one (#15151).
- Under-copy in the Lua debugger (#15115).
- Sentinel config injection via `SENTINEL SET` (#14970).
- Client output buffer memory tracking not accounting for copy-avoided bulk string references (#14934).
- `INCREX` syntax update (#15237).
- Memory tracking can be enabled at runtime in non-clustered mode (#15005).

### Search and Query fixes

- `FT.PROFILE HYBRID` returns an empty reply (MOD-14778).
- `FT.SPELLCHECK` treats `PARAMS` placeholders as literal terms instead of resolving them (MOD-10596).
- `FT.PROFILE` output is inconsistent when a profiled value is missing (MOD-10560).
- `FT.CREATE` now rejects schema definitions with invalid option combinations at creation time (MOD-14655).
- `PERSIST` and `HPERSIST` notifications are not reflected in index expiration tracking (MOD-14800).
- Race condition in `FT.HYBRID` causes intermittent failures under concurrent hybrid query load (MOD-14732).
- Crash on `FT.SEARCH` when topology validation fails (for example, some nodes unreachable) (MOD-14475).
- Coordinator deadlock under mixed `FT.SEARCH` and `FT.AGGREGATE` load (MOD-14268).
- Memory leak when `FT.DROPINDEX` runs concurrently with in-flight hybrid queries (MOD-14135).
- `FT.CURSOR READ` timeout and `ON_TIMEOUT FAIL` not enforced on coordinator and shard (MOD-14284, MOD-14998).
- Cursors not cleaned up after `MAXIDLE`, causing resource exhaustion (MOD-6430).
- Coordinator `RETURN_STRICT` returns wrong data on partial results, including `SORTBY` pipeline (MOD-13617).
- `MAXPREFIXEXPANSION` warnings not propagated to clients in cluster mode (MOD-13804).
- Search commands fail when no worker thread is available instead of falling back to main thread (MOD-14921).
- RDB load missing validation of `FT.CREATE` arguments, allowing corrupt index state on load (MOD-13118).
- Use-after-move in `Indexer_Process` causes crash during indexing (MOD-14980).
- Deadlock between background query and main-thread writer (MOD-15364).
- `FT.PROFILE` prints output using wrong iterator type (MOD-14678).
- Confusing error returned when `DEBUG_PARAMS_COUNT` is zero (MOD-15118).
- Stack-smashing error in coordinator code path (MOD-14649).

### JSON fixes

- Trailing chars are ignored (MOD-7266).
- Wrong mutation ordering for array commands with recursive paths (MOD-6722).
- JSONPath evaluation issues (MOD-14664, MOD-7264, MOD-7272, MOD-7270, MOD-7268).

### Time series fixes

- Potential crash on disconnections and TLS failures (MOD-14850).
- `count`, `countNaN`, `countAll` reducers return NaN when all values are NaN (MOD-14420).
- Cluster topology changes during a multi-shard command are not handled (MOD-14439).

### Probabilistic fixes

- Memory leak on RDB load (MOD-15418).

## Performance and resource utilization improvements

Redis 8.8 delivers a broad set of performance improvements (compared to 8.6).

### Core improvements

- HyperLogLog: 4 independent accumulators that are merged at the end (#15049).
- Batched prefetch for `MGET` and `MSET` (#15133).
- Batched prefetch for `HGETALL` on hashtable-encoded hashes (#14988).
- Pass size hint to jemalloc for faster deallocation (#15071).
- Reduces allocator and accounting overhead by adding compile-time jemalloc tuning (#15096).

### Search and Query improvements

- Vector index hot path (HNSW and brute-force) devirtualized, reducing per-query latency (MOD-14916).
- Inline LSE atomics enabled on AArch64, improving atomic operation throughput on ARM64 (MOD-14916, MOD-15419).
- Expiration handling overhead reduced when many keys expire simultaneously (MOD-14916).
- LTO (link-time optimization) enabled for x86_64 release builds (MOD-14700).
- Shard-level timeout adjusted to coordinator dispatch time for more accurate accounting (MOD-13189).
- Iterators ported to Rust, reducing FFI overhead.
- `numRecords` no longer updated for vector fields, removing unnecessary write overhead on ingest (MOD-15487).
- VecSim SVS thread pool integrated with the worker pool for better thread utilization (MOD-9881).

## Configuration parameters

Redis 8.8 introduces new configuration parameters (compared to 8.8-M03):

- Slowlog entry truncation limits (#15182):
  - `slowlog-entry-max-argc`: maximum number of command arguments kept in a slowlog entry.
  - `slowlog-entry-max-string-len`: maximum length of a command argument in a slowlog entry.
- Default maximum worker threads value updated; `MAX_WORKER_THREADS` is now a string config (MOD-14486, MOD-14763).

## Metrics

- `FT.PROFILE`: added queue time tracking (MOD-13602).

## CLI tools

- Fixed memory leak on malformed legacy help entry in `redis-cli` (#15150).

