Redis 8.10

What's new in Redis 8.10

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 command (#15364) provides high-throughput bulk insertion of compact hashes.

BACKUP command

The new 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 and BLMOVEM commands (#15405) move multiple elements between lists in a single operation.

Set cardinality commands

The new SUNIONCARD command (#14893) returns the cardinality of the union of multiple sets, and the new SDIFFCARD command (#15278) returns the cardinality of the difference between sets, without materializing the result.

Streams reply caps

XREAD and 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 adds a new reply argument (#15347): the total argument count for the logged command.

FT.ALIASLIST

The new 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 gains a new COLLECT reducer (#Q9291) that separates remote and local reducer invocations (RED-177887).

Stricter query timeout enforcement

FT.SEARCH, FT.AGGREGATE, and 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 and TS.NREVRANGE commands (#T2052) query a range across multiple time series and group results by timestamp (RED-149232).
  • The new TS.READ command (#T2054) performs an optionally blocking read (RED-132421).
  • The new TS.QUERYLABELS command (#T2090) returns a list of labels and label-values (RED-132355).
  • TS.MRANGE and 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).
RATE THIS PAGE
Back to top ↑