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
HIMPORTbulk-insertion command BACKUP: node-side backup and restore based on multi-part AOF (MP-AOF)LMOVEM,BLMOVEM: move multiple elements between listsSUNIONCARD,SDIFFCARD: get the cardinality of the union or difference of setsXREAD,XREADGROUP: newMAXCOUNTandMAXSIZEarguments to cap the cumulative reply- New
SCRIPT_RUNNERcommand flag for commands that execute scripts or functions FT.ALIASLIST: get all aliases for a Search indexFT.AGGREGATE: newCOLLECTreducer, plus stricter queryTIMEOUTenforcement- 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\nsequences 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. Withsearch-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 whensearch-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/sizeofandemptyoperators on string, array, object, and nodelistinandninoperators: 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.NRANGEandTS.NREVRANGEcommands (#T2052) query a range across multiple time series and group results by timestamp (RED-149232). - The new
TS.READcommand (#T2054) performs an optionally blocking read (RED-132421). - The new
TS.QUERYLABELScommand (#T2090) returns a list of labels and label-values (RED-132355). TS.MRANGEandTS.MREVRANGEaccept a newEXCLUDEEMPTYargument (#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 USAGEover-reports memory consumption (#15462).- Full sync under heavy write load (#15447).
- Unit mismatch disables the FAST expire cycle stale trigger (#15412).
- Crash on
VRANDMEMBERwithLLONG_MINcount (#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
BITFIELDoffset parsing (#15433). - The select-based event loop backend enqueues registered file descriptors that
select()did not mark ready (#15446). mem_clients_normaldrift 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_ResetDatasetandRM_RdbLoad(#15377). - NULL dereference (#15391, #15356).
- Overflow on memory unit conversions (#15390).
SETdoes not enforce mutually exclusiveNX/XXandIF*options (#15291).CONFIG SETdoes not reject duplicate arguments when using both primary name and alias (#15322).LSETout-of-range 64-bit index truncation (#15407).- Improve RDB load robustness for streams (#15308).
- Tighter cluster bus parsing for
PING,PONG, andMEETpackets (#15263). - Partial crash log on LoongArch architecture (#15247).
VADD ... CAS SETATTR: wrong attributes count (#15270).- Typo in
release.hthat could cause build failures.
Redis Search fixes
FT.CURSOR READ: crash after the underlying index was dropped (MOD-16703).FT.SEARCHwithLIMITreturns too many results in cluster mode over RESP3 (MOD-16767).FT.INFOcould report incorrect values for multi-value TAG fields after document updates (MOD-16745).FT.INFOreports a negativenum_recordsafter garbage collection on indexes with anINDEXMISSINGfield (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 .. WITHCOUNTcoordinator leaks resources on timeout (MOD-16210).- Local
FT.HYBRIDignoresON_TIMEOUT RETURN_STRICTand continues execution past the deadline (MOD-16492). - Blocked search clients trigger unnecessary query dumps, adding CPU and log overhead (MOD-16518).
FT.HYBRIDsupportsEXPLAINSCORE, exposing the fusion method (RRForLINEAR) (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.INCRBYwithTIMESTAMP *replication timestamp drift.
Probabilistic fixes
CF.LOADCHUNKpartial 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/HMSETon 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
XREADGROUPperformance (#15256). - Improve
RESTORE REPLACEperformance 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 beforefork()(#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 STATShash_templates: number of distinct compact hash templates.INFO STATShash_template_keys: total number of keys backed by a compact hash template.INFO MEMORYused_memory_hash_templates: total memory used by all compact hash templates.MEMORY STATShash.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-historyfor reporting user-chosen percentiles (#15352). redis-cli --cluster rebalance: CROSSSLOT error when using-userwithout-a(#15262).redis-cli --cluster reshardandrebalancenow move slots with server-side atomic slot migration (#15338).