{
  "id": "redisos-8.10-release-notes",
  "title": "Redis Open Source 8.10 release notes",
  "url": "https://redis.io/docs/latest/operate/oss_and_stack/stack-with-enterprise/release-notes/redisce/redisos-8.10-release-notes/",
  "summary": "Redis Open Source 8.10 release notes.",
  "tags": [
    "docs",
    "operate",
    "stack"
  ],
  "last_updated": "2026-08-05T11:50:41-05:00",
  "page_type": "content",
  "content_hash": "c7f0b6b00fb31f12202307447b5e62ce4dc7a005ce9ddb1f5da642e1c05d7046",
  "sections": [
    {
      "id": "8-10-0-july-2026",
      "title": "8.10.0 (July 2026)",
      "role": "overview",
      "text": "This is the General Availability release of Redis 8.10 in Redis Open Source."
    },
    {
      "id": "major-changes-compared-to-8-8",
      "title": "Major changes compared to 8.8",
      "role": "content",
      "text": "- Compact hashes - a new hash encoding that reduces memory usage by storing hash field names just once for keys that share a schema\n- New command: `HIMPORT` - high-throughput compact hash bulk insertion\n- TLS peer certificate-based server-to-server authentication\n- New commands: `LMOVEM`, `BLMOVEM` - move multiple elements between lists\n- New command: `SUNIONCARD` - get the cardinality of the union of multiple sets\n- New command: `SDIFFCARD` - get the cardinality of the difference between sets\n- New command: `BACKUP` - node-side implementation for backup and restore based on multi-part AOF (MP-AOF)\n- `XREAD`, `XREADGROUP` - new `MAXCOUNT` and `MAXSIZE` arguments to cap the cumulative reply entries and size\n- New command: `FT.ALIASLIST` - get all aliases for the index \n- Stemmer support for Malay and Tagalog languages \n- JSONPath extensions\n- New commands: `TS.NRANGE`, `TS.NREVRANGE` - Query a range across multiple time series; group results by timestamp \n- New command: `TS.READ` - optionally blocking read\n- New command: `TS.QUERYLABELS` - Get a list of labels and label-values \n- New command: `TS.MRANGE`, `TS.MREVRANGE` - new `EXCLUDEEMPTY` argument to exclude series with no reported samples \n- Performance improvements"
    },
    {
      "id": "binary-distributions",
      "title": "Binary distributions",
      "role": "content",
      "text": "- Alpine and Debian Docker images - https://hub.docker.com/_/redis\n- Install using snap - see https://github.com/redis/redis-snap\n- Install using brew - see https://github.com/redis/homebrew-redis\n- Install using RPM - see https://github.com/redis/redis-rpm\n- Install using Debian APT - see https://github.com/redis/redis-debian"
    },
    {
      "id": "operating-systems-we-test-redis-8-10-on",
      "title": "Operating systems we test Redis 8.10 on",
      "role": "content",
      "text": "- 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": "bug-fixes-compared-to-8-10-rc2",
      "title": "Bug fixes (compared to 8.10-RC2)",
      "role": "content",
      "text": "- [#15513](https://github.com/redis/redis/pull/15513) Prevented a division-by-zero error when active defragmentation thresholds are configured with equal or reversed value.\n- [#15453](https://github.com/redis/redis/pull/15453) Clients blocked on `BLPOP`, `BLMOVE`, or `BLMOVEM` could remain blocked after `SORT` with `STORE` replaced the target key with a list.\n- [#15499](https://github.com/redis/redis/pull/15499) Memory usage reported for compressed replication clients could be lower than the actual memory consumed.\n- [#15518](https://github.com/redis/redis/pull/15518) notify modules when node's own ip/port changes.\n- [#15539](https://github.com/redis/redis/pull/15539) Loading an AOF file with an RDB preamble could fail when active defragmentation was enabled.\n- RediSearch/RediSearch[#10528](https://github.com/redisearch/redisearch/pull/10528) Crash in the numeric range tree when background garbage collection encounters an empty leaf during active indexing on a numeric field. (MOD-16877)\n- RediSearch/RediSearch[#10605](https://github.com/redisearch/redisearch/pull/10605) FT.CREATE and FT.ALTER now reject an empty string as a field name, preventing a crash loop in the fork-GC on indexes with an empty TAG field. (MOD-17034)\n- RediSearch/RediSearch[#10488](https://github.com/redisearch/redisearch/pull/10488) FT.INFO reports a negative num_records after garbage collection on indexes that include an INDEXMISSING field. (MOD-16940)\n- RediSearch/RediSearch[#10568](https://github.com/redisearch/redisearch/pull/10568) Cluster FT.AGGREGATE fails with SEARCH_FIELD_DUP when a GROUPBY contains multiple REDUCE COLLECT calls over the same field differing only in option-keyword casing. (MOD-16365)\n- RediSearch/RediSearch[#10605](https://github.com/redisearch/redisearch/pull/10605) FT.CREATE and FT.ALTER now return an error when a field name is an empty string; previously such schemas were accepted silently. (MOD-17034)\n- RediSearch/RediSearch[#10522](https://github.com/redisearch/redisearch/pull/10522) coord_total_query_warnings_timeout double-counts timeout warnings for FT.SEARCH queries that use a hybrid (vector + filter) execution path. (MOD-15973)"
    },
    {
      "id": "redis-open-source-8-10-rc2-july-2026",
      "title": "Redis Open Source 8.10-RC2 (July 2026)",
      "role": "content",
      "text": "This is the second Release Candidate of Redis 8.10 in Redis Open Source.\n\nRelease Candidates are feature-complete pre-releases. Pre-releases are not suitable for production use."
    },
    {
      "id": "bug-fixes-compared-to-8-10-rc1",
      "title": "Bug fixes (compared to 8.10-RC1)",
      "role": "content",
      "text": "- A user can manipulate data read by a connection by injecting `\\r\\n` sequences into a Redis error reply\n- A typo in `release.h` that could cause build failures"
    },
    {
      "id": "redis-open-source-8-10-rc1-july-2026",
      "title": "Redis Open Source 8.10-RC1 (July 2026)",
      "role": "content",
      "text": "This is the first Release Candidate of Redis 8.10 in Redis Open Source.\n\nRelease Candidates are feature-complete pre-releases. Pre-releases are not suitable for production use."
    },
    {
      "id": "headlines",
      "title": "Headlines:",
      "role": "content",
      "text": "Redis 8.10 introduces new features and performance improvements."
    },
    {
      "id": "operating-systems-we-test-redis-8-10-on-1",
      "title": "Operating systems we test Redis 8.10 on",
      "role": "content",
      "text": "- 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": "new-features-compared-to-8-8",
      "title": "New Features (compared to 8.8)",
      "role": "content",
      "text": "- [#15364](https://github.com/redis/redis/pull/15364) Compact hashes - a new hash encoding that reduces memory usage by storing hash field names just once for keys that share a schema\n- [#15364](https://github.com/redis/redis/pull/15364) New command: `HIMPORT` - high-throughput compact hash bulk insertion\n- [#15405](https://github.com/redis/redis/pull/15405) New commands: `LMOVEM`, `BLMOVEM` - move multiple elements between lists\n- [#14893](https://github.com/redis/redis/pull/14893) New command: `SUNIONCARD` - get the cardinality of the union of multiple sets\n- [#15278](https://github.com/redis/redis/pull/15278) New command: `SDIFFCARD` - get the cardinality of the difference between sets\n- [#15441](https://github.com/redis/redis/pull/15441) New command: `BACKUP` - node-side implementation for backup and restore based on multi-part AOF (MP-AOF)\n- [#15282](https://github.com/redis/redis/pull/15282) `XREAD`, `XREADGROUP` - new `MAXCOUNT` and `MAXSIZE` arguments to cap the cumulative reply entries and size\n- [#15337](https://github.com/redis/redis/pull/15337) New `SCRIPT_RUNNER` command flag: flag commands that execute scripts or functions\n- [#15347](https://github.com/redis/redis/pull/15347) `SLOWLOG GET` - new reply argument: total argument count\n- [#Q9626](https://github.com/RediSearch/RediSearch/pull/9626) New command: `FT.ALIASLIST` - get all aliases for the index (RED-197340)\n- [#Q9052](https://github.com/RediSearch/RediSearch/pull/9052) Stemmer support for Malay and Tagalog languages (RED-132425)\n- [#Q9291](https://github.com/RediSearch/RediSearch/pull/9291) `FT.AGGREGATE` - new `COLLECT` reducer: separate remote and local reducer invocations (RED-177887)\n- [#Q8169](https://github.com/RediSearch/RediSearch/pull/8169), [#Q8236](https://github.com/RediSearch/RediSearch/pull/8236), [#Q9234](https://github.com/RediSearch/RediSearch/pull/9234), [#Q9443](https://github.com/RediSearch/RediSearch/pull/9443), [#Q9861](https://github.com/RediSearch/RediSearch/pull/9861) `FT.SEARCH`, `FT.AGGREGATE`, `FT.HYBRID`: enforce query `TIMEOUT` more strictly\n  - The `search-on-timeout` policy now offers three options:\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  - Queries executed on the main thread (i.e., when `search-workers` is 0) are capped by [`search-_max-foreground-timeout-limit`](https://redis.io/docs/latest/develop/ai/search-and-query/administration/configuration#search-_max-foreground-timeout-limit) (default `60000` ms).\n- [#J1602](https://github.com/RedisJSON/RedisJSON/pull/1602), [#J1603](https://github.com/RedisJSON/RedisJSON/pull/1603), [#J1604](https://github.com/RedisJSON/RedisJSON/pull/1604), [#J1607](https://github.com/RedisJSON/RedisJSON/pull/1607), [#J1618](https://github.com/RedisJSON/RedisJSON/pull/1618) JSONPath extensions (MOD-16274, MOD-16275):\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()`\n- [#T2052](https://github.com/RedisTimeSeries/RedisTimeSeries/pull/2052) New commands: `TS.NRANGE`, `TS.NREVRANGE` - Query a range across multiple time series; group results by timestamp (RED-149232)\n- [#T2054](https://github.com/RedisTimeSeries/RedisTimeSeries/pull/2054) New command: `TS.READ` - optionally blocking read (RED-132421)\n- [#T2090](https://github.com/RedisTimeSeries/RedisTimeSeries/pull/2090) New command: `TS.QUERYLABELS` - Get a list of labels and label-values (RED-132355)\n- [#T2072](https://github.com/RedisTimeSeries/RedisTimeSeries/pull/2072) New command: `TS.MRANGE`, `TS.MREVRANGE` - new `EXCLUDEEMPTY` argument to exclude series with no reported samples (RED-132536)"
    },
    {
      "id": "bug-fixes-compared-to-8-8-0",
      "title": "Bug fixes (compared to 8.8.0)",
      "role": "content",
      "text": "- [#15478](https://github.com/redis/redis/pull/15478) `SORT`, `GEORADIUS`, `GEORADIUSBYMEMBER`, `XREAD`, `XREADGROUP` - ACL permission bypass\n- [#15329](https://github.com/redis/redis/pull/15329), [#15467](https://github.com/redis/redis/pull/15467) I/O thread busy looping for replica clients\n- [#15466](https://github.com/redis/redis/pull/15466) Duplicate KeyMeta restoration in `RESTORE`-based AOF rewrites\n- [#15462](https://github.com/redis/redis/pull/15462) `MEMORY USAGE` over-reports memory consumption\n- [#15447](https://github.com/redis/redis/pull/15447) Full sync under heavy write load\n- [#15412](https://github.com/redis/redis/pull/15412) Unit mismatch disables the FAST expire cycle stale trigger\n- [#15392](https://github.com/redis/redis/pull/15392) Crash on `VRANDMEMBER` with `LLONG_MIN` count\n- [#15409](https://github.com/redis/redis/pull/15409) `CONFIG SET` - crash on TLS options in non-TLS builds\n- [#15371](https://github.com/redis/redis/pull/15371) ACL key-name leak in BCAST client-side caching invalidations\n- [#15433](https://github.com/redis/redis/pull/15433) Signed overflow in `BITFIELD` offset parsing\n- [#15446](https://github.com/redis/redis/pull/15446) The select-based event loop backend enqueues registered file descriptors that `select()` did not mark ready\n- [#15309](https://github.com/redis/redis/pull/15309) `mem_clients_normal` drift when a replica drops its cached master after a failed partial resync\n- [#15357](https://github.com/redis/redis/pull/15357) Crash on missing module numeric config\n- [#15377](https://github.com/redis/redis/pull/15377) In-progress atomic slot migration tasks keep running on `RM_ResetDataset` and `RM_RdbLoad`\n- [#15391](https://github.com/redis/redis/pull/15391), [#15356](https://github.com/redis/redis/pull/15356), [#15436](https://github.com/redis/redis/pull/15436) NULL dereference\n- [#15390](https://github.com/redis/redis/pull/15390) Overflow on memory unit conversions\n- [#15291](https://github.com/redis/redis/pull/15291) `SET` does not enforce mutually exclusive `NX`/`XX` and `IF*` options\n- [#15322](https://github.com/redis/redis/pull/15322) `CONFIG SET` does not reject duplicate arguments when using both primary name and alias\n- [#15407](https://github.com/redis/redis/pull/15407) `LSET` out-of-range 64-bit index truncation\n- [#15308](https://github.com/redis/redis/pull/15308) Improve RDB load robustness (streams)\n- [#15263](https://github.com/redis/redis/pull/15263) Tighter cluster bus parsing for `PING`, `PONG`, and `MEET` packets\n- [#15247](https://github.com/redis/redis/pull/15247) Partial crash log on LoongArch architecture\n- [#15270](https://github.com/redis/redis/pull/15270) `VADD ... CAS SETATTR` - wrong attributes count\n- [#Q10375](https://github.com/RediSearch/RediSearch/pull/10375) `FT.CURSOR READ`: crash after the underlying index was dropped (MOD-16703)\n- [#Q10408](https://github.com/RediSearch/RediSearch/pull/10408) `FT.SEARCH` with `LIMIT` returns too many results in cluster mode over RESP3 (MOD-16767)\n- [#Q10420](https://github.com/RediSearch/RediSearch/pull/10420) `FT.INFO` could report incorrect values for multi-value TAG fields after document updates (MOD-16745)\n- [#Q10488](https://github.com/RediSearch/RediSearch/pull/10488) `FT.INFO` reports a negative `num_records` after garbage collection on indexes with an `INDEXMISSING` field (MOD-16940)\n- [#Q10392](https://github.com/RediSearch/RediSearch/pull/10392) Vector search: crash (SIGSEGV) in FP32/L2 distance computation on x86 without AVX support, affecting certain vector dimensions (MOD-16730)\n- [#Q9963](https://github.com/RediSearch/RediSearch/pull/9963) Range query returns incomplete results when the lower bound is an excluded empty string (MOD-15897)\n- [#Q10066](https://github.com/RediSearch/RediSearch/pull/10066) `FT.AGGREGATE .. WITHCOUNT` coordinator leaks resources on timeout (MOD-16210)\n- [#Q10247](https://github.com/RediSearch/RediSearch/pull/10247) Local `FT.HYBRID` ignores `ON_TIMEOUT RETURN_STRICT` and continues execution past the deadline (MOD-16492)\n- [#Q10255](https://github.com/RediSearch/RediSearch/pull/10255) Blocked search clients trigger unnecessary query dumps, adding CPU and log overhead (MOD-16518)\n- [#Q10151](https://github.com/RediSearch/RediSearch/pull/10151) `FT.HYBRID` supports `EXPLAINSCORE`, exposing the fusion method (`RRF` or `LINEAR`) (MOD-10044)\n- [#J1542](https://github.com/RedisJSON/RedisJSON/pull/1542), [#J1543](https://github.com/RedisJSON/RedisJSON/pull/1543) Wrong results when evaluating paths with recursive descent (MOD-6722, MOD-14664)\n- [#J1554](https://github.com/RedisJSON/RedisJSON/pull/1554) Any literal that starts with true/false/null is interpreted as true/false/null (MOD-7266)\n- [#J1600](https://github.com/RedisJSON/RedisJSON/pull/1600) Improve RDB load robustness\n- [#T2067](https://github.com/RedisTimeSeries/RedisTimeSeries/pull/2067) `TS.INFO` - inaccurate memory usage calculation (MOD-6409)\n- [#T2036](https://github.com/RedisTimeSeries/RedisTimeSeries/pull/2036), [#T2053](https://github.com/RedisTimeSeries/RedisTimeSeries/pull/2053), [#T2056](https://github.com/RedisTimeSeries/RedisTimeSeries/pull/2056), [#T2074](https://github.com/RedisTimeSeries/RedisTimeSeries/pull/2074) Aggregation fixes (MOD-8187, MOD-16224, MOD-15565)\n- [#T2004](https://github.com/RedisTimeSeries/RedisTimeSeries/pull/2004), [#T2051](https://github.com/RedisTimeSeries/RedisTimeSeries/pull/2051) Improve RDB load robustness\n- [#T2104](https://github.com/RedisTimeSeries/RedisTimeSeries/pull/2104) Issues after cluster topology changes\n- [#T2122](https://github.com/RedisTimeSeries/RedisTimeSeries/pull/2122) Error on the first cross-shard command (TLS)\n- [#T2109](https://github.com/RedisTimeSeries/RedisTimeSeries/pull/2109) `TS.INCRBY` with `TIMESTAMP *` replication timestamp drift\n- [#P1014](https://github.com/RedisBloom/RedisBloom/pull/1014) `CF.LOADCHUNK` partial replication (MOD-16050)\n- [#P1026](https://github.com/RedisBloom/RedisBloom/pull/1026), [#P1027](https://github.com/RedisBloom/RedisBloom/pull/1027) Improve RDB load robustness"
    },
    {
      "id": "performance-and-resource-utilization-improvements-compared-to-8-8-0",
      "title": "Performance and resource utilization improvements (compared to 8.8.0)",
      "role": "performance",
      "text": "- [#15376](https://github.com/redis/redis/pull/15376) Optimize `lpSeek()` by validating entries only when necessary\n- [#15345](https://github.com/redis/redis/pull/15345) Optimize wide `HSET`/`HMSET` on a fresh hash with a single batched listpack append\n- [#15330](https://github.com/redis/redis/pull/15330) Avoid recomputing allocator fragmentation twice per cron tick (RED-200844)\n- [#15259](https://github.com/redis/redis/pull/15259) Trim excess SDS allocation in inline command parsing\n- [#15256](https://github.com/redis/redis/pull/15256) rax memory reduction: leaf-inlining for fixed-length-key trees - improves `XREADGROUP` performance\n- [#15397](https://github.com/redis/redis/pull/15397) Improve `RESTORE REPLACE` performance for new keys\n- [#14704](https://github.com/redis/redis/pull/14704) Optimizes an internal memory accounting\n- [#Q10246](https://github.com/RediSearch/RediSearch/pull/10246) Write operations block on a read lock held throughout vector range query result collection (MOD-16437)\n- [#Q10392](https://github.com/RediSearch/RediSearch/pull/10392) Vector search: reduce HNSW index memory usage with one-byte per-node locks (MOD-16696)\n- [#J1617](https://github.com/RedisJSON/RedisJSON/pull/1617) JSON - memory object footprint improvements (MOD-16608)"
    },
    {
      "id": "modules-api",
      "title": "Modules API",
      "role": "content",
      "text": "- [#15350](https://github.com/redis/redis/pull/15350) `RedisModuleEvent_ClusterTopologyChange` - cluster topology change\n- [#15327](https://github.com/redis/redis/pull/15327) `REDISMODULE_SUBEVENT_FORK_CHILD_*` - allow multi-threaded modules can quiesce background work before `fork()`\n- [#15373](https://github.com/redis/redis/pull/15373) `REDISMODULE_SUBEVENT_CLUSTER_SLOT_MIGRATION_MIGRATE_MODULE_PROPAGATE_END` - inject commands after ASM replication stream\n- [#15242](https://github.com/redis/redis/pull/15242) `RedisModule_AddPostNotificationJobForKey` - binds deferred work to a specific key from a keyspace-notification handler"
    },
    {
      "id": "configuration-parameters",
      "title": "Configuration parameters",
      "role": "configuration",
      "text": "- [#15364](https://github.com/redis/redis/pull/15364) Compact hashes:\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": "- [#15364](https://github.com/redis/redis/pull/15364) Compact hashes:\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": "- [#15352](https://github.com/redis/redis/pull/15352) Adds `--latency-percentiles <p1,p2,...>` to `--latency` / `--latency-history`: reporting user-chosen percentiles\n- [#15262](https://github.com/redis/redis/pull/15262) `redis-cli --cluster rebalance` - CROSSSLOT error when using `-user` without `-a`\n- [#15338](https://github.com/redis/redis/pull/15338) `redis-cli --cluster reshard` and `rebalance` now move slots with server-side atomic slot migration"
    }
  ],
  "examples": []
}
