{
  "id": "8-8",
  "title": "Redis 8.8",
  "url": "https://redis.io/docs/latest/develop/whats-new/8-8/",
  "summary": "What's new in Redis 8.8",
  "tags": [
    "docs",
    "operate",
    "rs",
    "rc"
  ],
  "last_updated": "2026-05-25T10:30:01-07:00",
  "page_type": "content",
  "content_hash": "0e54dc0f83fc7e8aa012d29207da9e33e43326e2d8e2d417a1345dae94581150",
  "sections": [
    {
      "id": "overview",
      "title": "Overview",
      "role": "overview",
      "text": "Redis 8.8 introduces new features and performance improvements, building on the foundation of Redis 8.6.\n\nThis release delivers improvements across multiple areas:\n- A new Array data structure\n- Subkey notification for hash fields (field-level notifications)\n- `INCREX`: window counter rate limiter combining `INCR`, `INCRBY`, `INCRBYFLOAT`, bounds, and expiration\n- `XNACK`: new streams command that lets consumers explicitly release pending messages\n- `ZUNION`, `ZINTER`, `ZUNIONSTORE`, `ZINTERSTORE`: new `COUNT` aggregator\n- `JSON.SET`: new `FPHA` argument to specify the FP type for homogeneous FP arrays\n- `TS.RANGE`, `TS.REVRANGE`, `TS.MRANGE`, `TS.MREVRANGE`: multiple aggregators in a single command\n- `FT.HYBRID` `KNN` clause: new argument to request fewer candidates per shard\n- `FT.PROFILE` `HYBRID`: profiling support for `FT.HYBRID`\n- New in-group sorting reducer - `COLLECT` for `FT.AGGREGATE`\n- Substantial Search and Query performance improvements (Rust iterators, devirtualized vector hot paths, AArch64 atomics)\n- HyperLogLog, `MGET`/`MSET`, and `HGETALL` performance improvements\n- Numerous security fixes and bug fixes across core, Search, JSON, Time Series, and Probabilistic\n\nBelow is a detailed breakdown of these updates."
    },
    {
      "id": "supported-operating-systems",
      "title": "Supported operating systems",
      "role": "compatibility",
      "text": "Redis 8.8 is tested on:\n\n- Ubuntu 22.04 (Jammy Jellyfish), 24.04 (Noble Numbat), 26.04 (Resolute Raccoon)\n- Rocky Linux 8.10, 9.7, 10.1\n- AlmaLinux 8.10, 9.7, 10.1\n- Debian 12.13 (Bookworm), Debian 13.4 (Trixie)\n- Alpine 3.23\n- macOS 14.8.4 (Sonoma), 15.7.4 (Sequoia), 26.3 (Tahoe) - for both Intel and ARM"
    },
    {
      "id": "security-fixes",
      "title": "Security fixes",
      "role": "security",
      "text": "Redis 8.8 includes important security fixes (compared to 8.8-M03):\n\n- (CVE-2026-23479) Use-After-Free in unblock client flow may lead to remote code execution.\n- (CVE-2026-25243) Invalid memory access in `RESTORE` may lead to remote code execution.\n- (CVE-2026-23631) Lua Use-After-Free may lead to remote code execution.\n- (CVE-2026-25588) Invalid memory access in `RESTORE` may lead to remote code execution (Time Series).\n- (CVE-2026-25589) Invalid memory access in `RESTORE` may lead to remote code execution (Probabilistic)."
    },
    {
      "id": "new-features",
      "title": "New features",
      "role": "content",
      "text": ""
    },
    {
      "id": "array-data-structure",
      "title": "Array data structure",
      "role": "content",
      "text": "Redis 8.8 introduces a new Array data structure (#15162), providing a dedicated data type for ordered, indexable collections."
    },
    {
      "id": "hash-field-level-notifications",
      "title": "Hash field-level notifications",
      "role": "content",
      "text": "Redis 8.8 adds subkey notifications for hash fields, enabling field-level keyspace notifications for hash data."
    },
    {
      "id": "increx-rate-limiter",
      "title": "INCREX rate limiter",
      "role": "content",
      "text": "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."
    },
    {
      "id": "xnack-streams-command",
      "title": "XNACK streams command",
      "role": "content",
      "text": "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."
    },
    {
      "id": "sorted-set-count-aggregator",
      "title": "Sorted set COUNT aggregator",
      "role": "content",
      "text": "[`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."
    },
    {
      "id": "json-set-fpha-argument",
      "title": "JSON.SET FPHA argument",
      "role": "content",
      "text": "[`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."
    },
    {
      "id": "time-series-multiple-aggregators",
      "title": "Time series multiple aggregators",
      "role": "content",
      "text": "[`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."
    },
    {
      "id": "ft-hybrid-candidates-per-shard",
      "title": "FT.HYBRID candidates per shard",
      "role": "content",
      "text": "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."
    },
    {
      "id": "ft-profile-hybrid",
      "title": "FT.PROFILE HYBRID",
      "role": "content",
      "text": "[`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."
    },
    {
      "id": "in-group-sorting-reducer",
      "title": "In-group sorting reducer",
      "role": "content",
      "text": "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."
    },
    {
      "id": "bug-fixes",
      "title": "Bug fixes",
      "role": "content",
      "text": "Redis 8.8 includes a broad set of bug fixes (compared to 8.8-M03)."
    },
    {
      "id": "core-fixes",
      "title": "Core fixes",
      "role": "content",
      "text": "- `SUBSCRIBE`, `PSUBSCRIBE`, `SSUBSCRIBE`: crash on OOM (RED-167788).\n- `CONFIG SET`: some settings allow invalid characters (RED-167787).\n- `SCRIPT DEBUG`: potential crash on scripts (RED-175507).\n- `VADD`: crash or buffer overflow on large `REDUCE` value (RED-170921).\n- `VSET`: crash on huge allocations (MOD-12678).\n- `cluster-announce-ip` rejecting hostnames (regression) (#15188).\n- Double free when loading streams with duplicate consumer PEL entries (#15095).\n- Issues processing corrupt Streams RDB data (#15124).\n- `fast_float_strtod` rounding mismatch (#15111).\n- `vecClear` reset the logical size without releasing element ownership (#15190).\n- `MULTI` queue incorrect memory accounting (#15163).\n- Cluster crash when `CLIENT KILL` unsubscribes `SSUBSCRIBE` client inside `EXEC` (#15094).\n- Listpack backlength encoding thresholds off-by-one (#15151).\n- Under-copy in the Lua debugger (#15115).\n- Sentinel config injection via `SENTINEL SET` (#14970).\n- Client output buffer memory tracking not accounting for copy-avoided bulk string references (#14934).\n- `INCREX` syntax update (#15237).\n- Memory tracking can be enabled at runtime in non-clustered mode (#15005)."
    },
    {
      "id": "search-and-query-fixes",
      "title": "Search and Query fixes",
      "role": "content",
      "text": "- `FT.PROFILE HYBRID` returns an empty reply (MOD-14778).\n- `FT.SPELLCHECK` treats `PARAMS` placeholders as literal terms instead of resolving them (MOD-10596).\n- `FT.PROFILE` output is inconsistent when a profiled value is missing (MOD-10560).\n- `FT.CREATE` now rejects schema definitions with invalid option combinations at creation time (MOD-14655).\n- `PERSIST` and `HPERSIST` notifications are not reflected in index expiration tracking (MOD-14800).\n- Race condition in `FT.HYBRID` causes intermittent failures under concurrent hybrid query load (MOD-14732).\n- Crash on `FT.SEARCH` when topology validation fails (for example, some nodes unreachable) (MOD-14475).\n- Coordinator deadlock under mixed `FT.SEARCH` and `FT.AGGREGATE` load (MOD-14268).\n- Memory leak when `FT.DROPINDEX` runs concurrently with in-flight hybrid queries (MOD-14135).\n- `FT.CURSOR READ` timeout and `ON_TIMEOUT FAIL` not enforced on coordinator and shard (MOD-14284, MOD-14998).\n- Cursors not cleaned up after `MAXIDLE`, causing resource exhaustion (MOD-6430).\n- Coordinator `RETURN_STRICT` returns wrong data on partial results, including `SORTBY` pipeline (MOD-13617).\n- `MAXPREFIXEXPANSION` warnings not propagated to clients in cluster mode (MOD-13804).\n- Search commands fail when no worker thread is available instead of falling back to main thread (MOD-14921).\n- RDB load missing validation of `FT.CREATE` arguments, allowing corrupt index state on load (MOD-13118).\n- Use-after-move in `Indexer_Process` causes crash during indexing (MOD-14980).\n- Deadlock between background query and main-thread writer (MOD-15364).\n- `FT.PROFILE` prints output using wrong iterator type (MOD-14678).\n- Confusing error returned when `DEBUG_PARAMS_COUNT` is zero (MOD-15118).\n- Stack-smashing error in coordinator code path (MOD-14649)."
    },
    {
      "id": "json-fixes",
      "title": "JSON fixes",
      "role": "content",
      "text": "- Trailing chars are ignored (MOD-7266).\n- Wrong mutation ordering for array commands with recursive paths (MOD-6722).\n- JSONPath evaluation issues (MOD-14664, MOD-7264, MOD-7272, MOD-7270, MOD-7268)."
    },
    {
      "id": "time-series-fixes",
      "title": "Time series fixes",
      "role": "content",
      "text": "- Potential crash on disconnections and TLS failures (MOD-14850).\n- `count`, `countNaN`, `countAll` reducers return NaN when all values are NaN (MOD-14420).\n- Cluster topology changes during a multi-shard command are not handled (MOD-14439)."
    },
    {
      "id": "probabilistic-fixes",
      "title": "Probabilistic fixes",
      "role": "content",
      "text": "- Memory leak on RDB load (MOD-15418)."
    },
    {
      "id": "performance-and-resource-utilization-improvements",
      "title": "Performance and resource utilization improvements",
      "role": "performance",
      "text": "Redis 8.8 delivers a broad set of performance improvements (compared to 8.6)."
    },
    {
      "id": "core-improvements",
      "title": "Core improvements",
      "role": "content",
      "text": "- HyperLogLog: 4 independent accumulators that are merged at the end (#15049).\n- Batched prefetch for `MGET` and `MSET` (#15133).\n- Batched prefetch for `HGETALL` on hashtable-encoded hashes (#14988).\n- Pass size hint to jemalloc for faster deallocation (#15071).\n- Reduces allocator and accounting overhead by adding compile-time jemalloc tuning (#15096)."
    },
    {
      "id": "search-and-query-improvements",
      "title": "Search and Query improvements",
      "role": "content",
      "text": "- Vector index hot path (HNSW and brute-force) devirtualized, reducing per-query latency (MOD-14916).\n- Inline LSE atomics enabled on AArch64, improving atomic operation throughput on ARM64 (MOD-14916, MOD-15419).\n- Expiration handling overhead reduced when many keys expire simultaneously (MOD-14916).\n- LTO (link-time optimization) enabled for x86_64 release builds (MOD-14700).\n- Shard-level timeout adjusted to coordinator dispatch time for more accurate accounting (MOD-13189).\n- Iterators ported to Rust, reducing FFI overhead.\n- `numRecords` no longer updated for vector fields, removing unnecessary write overhead on ingest (MOD-15487).\n- VecSim SVS thread pool integrated with the worker pool for better thread utilization (MOD-9881)."
    },
    {
      "id": "configuration-parameters",
      "title": "Configuration parameters",
      "role": "configuration",
      "text": "Redis 8.8 introduces new configuration parameters (compared to 8.8-M03):\n\n- Slowlog entry truncation limits (#15182):\n  - `slowlog-entry-max-argc`: maximum number of command arguments kept in a slowlog entry.\n  - `slowlog-entry-max-string-len`: maximum length of a command argument in a slowlog entry.\n- Default maximum worker threads value updated; `MAX_WORKER_THREADS` is now a string config (MOD-14486, MOD-14763)."
    },
    {
      "id": "metrics",
      "title": "Metrics",
      "role": "content",
      "text": "- `FT.PROFILE`: added queue time tracking (MOD-13602)."
    },
    {
      "id": "cli-tools",
      "title": "CLI tools",
      "role": "content",
      "text": "- Fixed memory leak on malformed legacy help entry in `redis-cli` (#15150)."
    }
  ],
  "examples": []
}
