{
  "id": "8-10",
  "title": "Redis 8.10",
  "url": "https://redis.io/docs/latest/develop/whats-new/8-10/",
  "summary": "What's new in Redis 8.10",
  "tags": [
    "docs",
    "operate",
    "rs",
    "rc"
  ],
  "last_updated": "2026-07-31T16:56:30+01:00",
  "page_type": "content",
  "content_hash": "778c4a49ef28e85e192d23bce6ad757b909eb6302aa4effc28f9bd12ea28e3d9",
  "sections": [
    {
      "id": "overview",
      "title": "Overview",
      "role": "overview",
      "text": "Redis 8.10 introduces new features and performance improvements, building on the foundation of Redis 8.8.\n\nThis release delivers improvements across multiple areas:\n- Compact hashes: a new hash encoding that reduces memory usage, plus the `HIMPORT` bulk-insertion command\n- `BACKUP`: node-side backup and restore based on multi-part AOF (MP-AOF)\n- `LMOVEM`, `BLMOVEM`: move multiple elements between lists\n- `SUNIONCARD`, `SDIFFCARD`: get the cardinality of the union or difference of sets\n- `XREAD`, `XREADGROUP`: new `MAXCOUNT` and `MAXSIZE` arguments to cap the cumulative reply\n- New `SCRIPT_RUNNER` command flag for commands that execute scripts or functions\n- `FT.ALIASLIST`: get all aliases for a Search index\n- `FT.AGGREGATE`: new `COLLECT` reducer, plus stricter query `TIMEOUT` enforcement\n- Extensive JSONPath extensions for JSON\n- New Time Series commands: `TS.NRANGE`, `TS.NREVRANGE`, `TS.READ`, `TS.QUERYLABELS`\n- Performance and resource utilization improvements across core, Search, and JSON\n- Numerous bug fixes across core, Search, JSON, Time Series, and Probabilistic\n- New Modules API events and functions\n- New standalone redis-cli installation support\n\nBelow is a detailed breakdown of these updates."
    },
    {
      "id": "supported-operating-systems",
      "title": "Supported operating systems",
      "role": "compatibility",
      "text": "Redis 8.10 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": "- Fixed an issue where a user could manipulate data read by a connection by injecting `\\r\\n` sequences into a Redis error reply."
    },
    {
      "id": "new-features",
      "title": "New features",
      "role": "content",
      "text": ""
    },
    {
      "id": "compact-hashes",
      "title": "Compact hashes",
      "role": "content",
      "text": "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."
    },
    {
      "id": "backup-command",
      "title": "BACKUP command",
      "role": "content",
      "text": "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)."
    },
    {
      "id": "list-multi-element-moves",
      "title": "List multi-element moves",
      "role": "content",
      "text": "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."
    },
    {
      "id": "set-cardinality-commands",
      "title": "Set cardinality commands",
      "role": "content",
      "text": "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."
    },
    {
      "id": "streams-reply-caps",
      "title": "Streams reply caps",
      "role": "content",
      "text": "[`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."
    },
    {
      "id": "script-runner-command-flag",
      "title": "SCRIPT_RUNNER command flag",
      "role": "content",
      "text": "A new `SCRIPT_RUNNER` command flag (#15337) flags commands that execute scripts or functions."
    },
    {
      "id": "slowlog-get-total-argument-count",
      "title": "SLOWLOG GET total argument count",
      "role": "content",
      "text": "[`SLOWLOG GET`](https://redis.io/docs/latest/commands/slowlog-get/) adds a new reply argument (#15347): the total argument count for the logged command."
    },
    {
      "id": "ft-aliaslist",
      "title": "FT.ALIASLIST",
      "role": "content",
      "text": "The new [`FT.ALIASLIST`](https://redis.io/docs/latest/commands/ft.aliaslist/) command (#Q9626) returns all aliases for an index (RED-197340)."
    },
    {
      "id": "additional-stemmer-languages",
      "title": "Additional stemmer languages",
      "role": "content",
      "text": "Redis Search adds stemmer support for Malay and Tagalog (#Q9052, RED-132425)."
    },
    {
      "id": "ft-aggregate-collect-reducer",
      "title": "FT.AGGREGATE COLLECT reducer",
      "role": "content",
      "text": "[`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)."
    },
    {
      "id": "stricter-query-timeout-enforcement",
      "title": "Stricter query timeout enforcement",
      "role": "content",
      "text": "[`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).\n\nThe `search-on-timeout` policy now offers three options:\n\n- `FAIL` — reject timed-out queries. With `search-workers > 0` (the default), the timeout is enforced preemptively.\n- `RETURN` (default) — return best-effort partial results, without enforcing strictness during post-processing.\n- `RETURN_STRICT` (new) — return best-effort partial results while enforcing the timeout through the post-processing (result) pipeline. Available when `search-workers > 0`.\n\nQueries executed on the main thread (that is, when `search-workers` is 0) are capped by `search-max-foreground-timeout-limit` (default 60000 ms)."
    },
    {
      "id": "jsonpath-extensions",
      "title": "JSONPath extensions",
      "role": "content",
      "text": "JSON adds extensive JSONPath extensions (#J1602, #J1603, #J1604, #J1607, #J1618; MOD-16274, MOD-16275):\n\n- Projection expressions at the top level of a JSONPath query\n- `==` and `!=` can now compare any literal, including array and object literals\n- Filter negation operator: `!`\n- `size`/`sizeof` and `empty` operators on string, array, object, and nodelist\n- `in` and `nin` operators: membership test on an array and nodelist\n- Operators on numbers: binary `-`, `+`, `*`, `/`, `%`, and unary `-` and `+`\n- Operator on object: `~`\n- `length()` function on array, object, and string\n- Functions on number: `abs()`, `ceiling()`, `floor()`\n- Functions on string: `match()`, `search()`\n- Strings concatenation with `concat()`\n- Functions on array: `first()`, `last()`, `index()`, `append()`\n- Aggregation functions on array: `min()`, `max()`, `avg()`, `sum()`, `stddev()`\n- Function on object: `keys()`\n- Function on nodelist: `count()`\n- Function on nodelist with exactly one node: `value()`\n- Relations functions on array and nodelist: `subsetof()`, `anyof()`, `noneof()`"
    },
    {
      "id": "time-series-range-and-query-commands",
      "title": "Time series range and query commands",
      "role": "content",
      "text": "- 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).\n- The new [`TS.READ`](https://redis.io/docs/latest/commands/ts.read/) command (#T2054) performs an optionally blocking read (RED-132421).\n- The new [`TS.QUERYLABELS`](https://redis.io/docs/latest/commands/ts.querylabels/) command (#T2090) returns a list of labels and label-values (RED-132355).\n- [`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)."
    },
    {
      "id": "bug-fixes",
      "title": "Bug fixes",
      "role": "content",
      "text": "Redis 8.10 includes a broad set of bug fixes (compared to 8.8.0)."
    },
    {
      "id": "core-fixes",
      "title": "Core fixes",
      "role": "content",
      "text": "- `SORT`, `GEORADIUS`, `GEORADIUSBYMEMBER`, `XREAD`, `XREADGROUP`: ACL permission bypass (#15478).\n- I/O thread busy looping for replica clients (#15329, #15467).\n- Duplicate KeyMeta restoration in `RESTORE`-based AOF rewrites (#15466).\n- `MEMORY USAGE` over-reports memory consumption (#15462).\n- Full sync under heavy write load (#15447).\n- Unit mismatch disables the FAST expire cycle stale trigger (#15412).\n- Crash on `VRANDMEMBER` with `LLONG_MIN` count (#15392).\n- `CONFIG SET`: crash on of TLS options in non-TLS builds (#15409).\n- ACL key-name leak in BCAST client-side caching invalidations (#15371).\n- Signed overflow in `BITFIELD` offset parsing (#15433).\n- The select-based event loop backend enqueues registered file descriptors that `select()` did not mark ready (#15446).\n- `mem_clients_normal` drift when a replica drops its cached master after a failed partial resync (#15309).\n- Crash on missing module numeric config (#15357).\n- In-progress atomic slot migration tasks keep running on `RM_ResetDataset` and `RM_RdbLoad` (#15377).\n- NULL dereference (#15391, #15356).\n- Overflow on memory unit conversions (#15390).\n- `SET` does not enforce mutually exclusive `NX`/`XX` and `IF*` options (#15291).\n- `CONFIG SET` does not reject duplicate arguments when using both primary name and alias (#15322).\n- `LSET` out-of-range 64-bit index truncation (#15407).\n- Improve RDB load robustness for streams (#15308).\n- Tighter cluster bus parsing for `PING`, `PONG`, and `MEET` packets (#15263).\n- Partial crash log on LoongArch architecture (#15247).\n- `VADD ... CAS SETATTR`: wrong attributes count (#15270).\n- Typo in `release.h` that could cause build failures."
    },
    {
      "id": "redis-search-fixes",
      "title": "Redis Search fixes",
      "role": "content",
      "text": "- `FT.CURSOR READ`: crash after the underlying index was dropped (MOD-16703).\n- `FT.SEARCH` with `LIMIT` returns too many results in cluster mode over RESP3 (MOD-16767).\n- `FT.INFO` could report incorrect values for multi-value TAG fields after document updates (MOD-16745).\n- `FT.INFO` reports a negative `num_records` after garbage collection on indexes with an `INDEXMISSING` field (MOD-16940).\n- Vector search: crash (SIGSEGV) in FP32/L2 distance computation on x86 without AVX support (MOD-16730).\n- Range query returns incomplete results when the lower bound is an excluded empty string (MOD-15897).\n- `FT.AGGREGATE .. WITHCOUNT` coordinator leaks resources on timeout (MOD-16210).\n- Local `FT.HYBRID` ignores `ON_TIMEOUT RETURN_STRICT` and continues execution past the deadline (MOD-16492).\n- Blocked search clients trigger unnecessary query dumps, adding CPU and log overhead (MOD-16518).\n- `FT.HYBRID` supports `EXPLAINSCORE`, exposing the fusion method (`RRF` or `LINEAR`) (MOD-10044)."
    },
    {
      "id": "json-fixes",
      "title": "JSON fixes",
      "role": "content",
      "text": "- Wrong results when evaluating paths with recursive descent (MOD-6722, MOD-14664).\n- Any literal that starts with true/false/null is interpreted as true/false/null (MOD-7266).\n- Improve RDB load robustness."
    },
    {
      "id": "time-series-fixes",
      "title": "Time series fixes",
      "role": "content",
      "text": "- `TS.INFO`: inaccurate memory usage calculation (MOD-6409).\n- Aggregation fixes (MOD-8187, MOD-16224, MOD-15565).\n- Improve RDB load robustness.\n- Issues after cluster topology changes.\n- Error on the first cross-shard command (TLS).\n- `TS.INCRBY` with `TIMESTAMP *` replication timestamp drift."
    },
    {
      "id": "probabilistic-fixes",
      "title": "Probabilistic fixes",
      "role": "content",
      "text": "- `CF.LOADCHUNK` partial replication (MOD-16050).\n- Improve RDB load robustness."
    },
    {
      "id": "performance-and-resource-utilization-improvements",
      "title": "Performance and resource utilization improvements",
      "role": "performance",
      "text": "Redis 8.10 delivers a broad set of performance improvements (compared to 8.8.0)."
    },
    {
      "id": "core-improvements",
      "title": "Core improvements",
      "role": "content",
      "text": "- Optimize `lpSeek()` by validating entries only when necessary (#15376).\n- Optimize wide `HSET`/`HMSET` on a fresh hash with a single batched listpack append (#15345).\n- Avoid recomputing allocator fragmentation twice per cron tick (#15330, RED-200844).\n- Trim excess SDS allocation in inline command parsing (#15259).\n- rax memory reduction: leaf-inlining for fixed-length-key trees, improving `XREADGROUP` performance (#15256).\n- Improve `RESTORE REPLACE` performance for new keys (#15397).\n- Optimizes an internal memory accounting (#14704)."
    },
    {
      "id": "redis-search-improvements",
      "title": "Redis Search improvements",
      "role": "content",
      "text": "- Write operations no longer block on a read lock held throughout vector range query result collection (#Q10246, MOD-16437).\n- Vector search: reduced HNSW index memory usage with one-byte per-node locks (#Q10392, MOD-16696)."
    },
    {
      "id": "json-improvements",
      "title": "JSON improvements",
      "role": "content",
      "text": "- JSON memory object footprint improvements (#J1617, MOD-16608)."
    },
    {
      "id": "modules-api",
      "title": "Modules API",
      "role": "content",
      "text": "- `RedisModuleEvent_ClusterTopologyChange`: cluster topology change (#15350).\n- `REDISMODULE_SUBEVENT_FORK_CHILD_*`: allow multi-threaded modules to quiesce background work before `fork()` (#15327).\n- `REDISMODULE_SUBEVENT_CLUSTER_SLOT_MIGRATION_MIGRATE_MODULE_PROPAGATE_END`: inject commands after the ASM replication stream (#15373).\n- `RedisModule_AddPostNotificationJobForKey`: binds deferred work to a specific key from a keyspace-notification handler (#15242)."
    },
    {
      "id": "configuration-parameters",
      "title": "Configuration parameters",
      "role": "configuration",
      "text": "Redis 8.10 introduces new configuration parameters for compact hashes (#15364):\n\n- `hash-rdb-load-min-template-entries`: minimum field count to convert a plain hash to a template during load.\n- `hash-rdb-load-max-template-entries`: maximum field count for load-time conversion.\n- `hash-rdb-load-template-disassembly-threshold`: minimum number of keys a converted template must end up with to be kept."
    },
    {
      "id": "metrics",
      "title": "Metrics",
      "role": "content",
      "text": "Redis 8.10 adds new metrics for compact hashes (#15364):\n\n- `INFO STATS` `hash_templates`: number of distinct compact hash templates.\n- `INFO STATS` `hash_template_keys`: total number of keys backed by a compact hash template.\n- `INFO MEMORY` `used_memory_hash_templates`: total memory used by all compact hash templates.\n- `MEMORY STATS` `hash.templates`: total memory used by all compact hash templates.\n- `MEMORY USAGE <key>` reports the key's own memory plus its share of a compact hash template's cost."
    },
    {
      "id": "cli-tools",
      "title": "CLI tools",
      "role": "content",
      "text": "- Adds `--latency-percentiles <p1,p2,...>` to `--latency` / `--latency-history` for reporting user-chosen percentiles (#15352).\n- `redis-cli --cluster rebalance`: CROSSSLOT error when using `-user` without `-a` (#15262).\n- `redis-cli --cluster reshard` and `rebalance` now move slots with server-side atomic slot migration (#15338)."
    }
  ],
  "examples": []
}
