redis 8.12-rc1
redis 8.12-rc1
This is the first Release Candidate of Redis 8.12 in Redis Open Source.
Release Candidates are feature-complete pre-releases. Pre-releases are not suitable for production use.
Headlines:
Redis 8.12 introduces new features and performance improvements.
Operating systems we test Redis 8.12 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
- RediSearch/RediSearch#10073 Indexed value hashing is now collision-resistant, preventing HashDoS-style index degradation from adversarial input. (MOD-14459)
- RediSearch/RediSearch#11202 Incomplete UTF-8 characters no longer reads out of bounds in indexed TEXT fields. (MOD-18088)
New Features
- #15331 Compressed bitmaps — Integrated redis-roaring into Redis core for lower memory usage and faster bitmap operations. Special thanks to Antonio, the original creator of redis-roaring, for contributing this capability! https://redisroaring.com/redis-merge/#/1;
- #15986 New command:
BITRANGEINTARRAYequivalent to redis-roaring’sR.RANGEINTARRAY, to return set bit offsets within a specified range - #15938 Set expiration to individual set member; New commands:
SEXPIRE,SPEXPIRE,SEXPIREAT,SPEXPIREATto set expiration andSTTL,SPTTL,SEXPIRETIME,SPEXPIRETIMEto retrieve remaining TTLs or expiration timestamps - #15649 Bless keys: avoid eviction of specified keys; New command:
BLESS - #15829
CLUSTER MIGRATION STATUSnow reports progress for both the snapshot and incremental migration phases - #15556
TLSnamed groups can now be configured usingtls-groups - RedisBloom/RedisBloom#1063 Count-min-sketch extensions: Added optional
CELL_SIZEsupport toCMS.INITBYDIMandCMS.INITBYPROBfor lower memory usage, negative increments inCMS.INCRBYto decrement counts, and cell size reporting inCMS.INFO - RedisJSON/RedisJSON#1640 Auto-create JSON deep path
- RediSearch/RediSearch#10151
EXPLAINSCOREis now supported forFT.HYBRID. (MOD-10044) - RediSearch/RediSearch#11330 SQ8 new compression is now available for HNSW vector fields. (MOD-6132)
- RediSearch/RediSearch#10247
RETURN_STRICTtimeout handling is now enabled for localFT.HYBRIDexecution. (MOD-16492) - RediSearch/RediSearch#11278
FT.ALTERavoids unnecessary document reindexing during schema additions. (MOD-18171) - RediSearch/RediSearch#11384 Score/payload-only hash updates avoid reindexing. (MOD-18182)
- RediSearch/RediSearch#11230 Hash documents are no longer re-indexed when no vector indexed field is touched. (MOD-17688)
Bug fixes
- #15569 Changes made by
XDELEX DELREFfor already-deleted stream entries could fail to propagate to replicas or the AOF - #15508 Operations using random radix-tree traversal could behave incorrectly when starting from certain leaf nodes
- #15604 Memory usage could be calculated incorrectly for hashes using shared templates
- #15489 RDB files could fail to load after
XSETIDreduced a stream’s entries_added counter - #15626
SETcould calculate an incorrect expiration time when given an excessively large relativeTTL - #15628 Active defragmentation could incorrectly handle the shared-template registry used by compact hashes
- #15530 After failover, a replica could remain connected to another replica instead of the new primary
- #15733 Invalid cluster slot ranges could be accepted after being merged into a valid range
- #15756
RESTOREcould calculate an incorrect expiration time when given an excessively large relativeTTL - #15699 Memory growth could be accounted for incorrectly when
SETBITorBITFIELDexpanded a string - #15815
XTRIMcould leave a stream in a state that prevented an RDB file containing it from loading - #15795 Clients could fail to receive a protocol error when a malformed command arrived across multiple network reads
- #15875
ARLASTITEMScould omit elements appearing after a gap in an array - #15916 Data could be lost when a legacy AOF file was upgraded before loading completed
- #15917 Hiredis clients on Linux could mishandle errors when establishing TCP connections
- #15869 Redis could crash when a module thread paused I/O threads
- #15468 - Pub/Sub subscriptions could remain active after the subscribing user’s channel permissions were revoked or the user was deleted, if the client had re-authenticated as another user.
- #15623 Module actions scheduled by hash-field expiration notifications could be delayed after fields expired in the background
- #15680 Data could be lost after a replica migrated to a different shard
- #15587
LMOVEMcould emit keyspace notifications inconsistent with those produced byLMOVE - #15695 Command side effects could be propagated to replicas or the AOF despite settings that should have excluded them
- RediSearch/RediSearch#10872 Shard no longer crashes with SIGSEGV when
RESTOREof a legacyft_index0payload is issued outside an RDB load. (MOD-15685) - RediSearch/RediSearch#10728 GC timer arming off the main thread on ARM no longer causes random shard crashes after extended uptime. (MOD-17309)
- RediSearch/RediSearch#10767 Server no longer crashes on writes when an index
FILTERreferences no schema fields. (MOD-15592) - RediSearch/RediSearch#11303, RediSearch/RediSearch#11304, RediSearch/RediSearch#11308, RediSearch/RediSearch#11309, RediSearch/RediSearch#11310, RediSearch/RediSearch#11311
FT.ALTER SCHEMA ADDrunning concurrently with queries underWORKERS>0no longer crashes query execution across VECTOR, TAG, NUMERIC, GEO, ISMISSING, and GEOSHAPE nodes. (MOD-18356, MOD-18361, MOD-18366, MOD-18367, MOD-18368) - RediSearch/RediSearch#11474
FT.AGGREGATEwith the numericSORTBYoptimizer no longer crashes or returns wrong results. (MOD-6967) - RediSearch/RediSearch#10209 Coordinator no longer crashes under RESP2 when
FT.PROFILE HYBRIDhits a return-strict timeout. (MOD-16396) - RediSearch/RediSearch#10145 TEXT PHONETIC matches now behave correctly when non-TEXT fields precede TEXT fields in the schema. (MOD-16304)
- RediSearch/RediSearch#11262
FT.AGGREGATEcursor withFILTERnow reports the correct result count. (MOD-18172) - RediSearch/RediSearch#11282
FT.EXPLAINnow renders a multi-word tag value as a single tag rather than anINTERSECT. (MOD-8666) - RediSearch/RediSearch#10768
NOTqueries no longer leak excluded documents or drop results after a concurrent index change. (MOD-17394) - RediSearch/RediSearch#10637 Numeric index cardinality and bounds are now correct under float compression. (MOD-16877)
- RediSearch/RediSearch#10704 Empty wildcard patterns no longer cause out-of-bounds writes or spurious empty-value matches. (MOD-17451)
- RediSearch/RediSearch#10752 Wildcard
?onWITHSUFFIXTRIETEXT fields now matches per codepoint rather than per byte. (MOD-17476) - RediSearch/RediSearch#10112 Suffix-trie wildcard queries on TEXT fields are now case-insensitive. (MOD-16259)
- RediSearch/RediSearch#11450 Matching literal
*no longer hangs on the indexed string. - RediSearch/RediSearch#11267 Duplicate vector results are no longer returned during tiered indexing. (MOD-17795)
- RediSearch/RediSearch#10731
FT.SEARCHon cluster now returns an error for invalidLIMITarguments, matching standalone behavior. (MOD-12465) - RediSearch/RediSearch#10251
FT.SEARCHunderWORKERS>0no longer returns a nil field-array for documents re-indexed mid-query. (MOD-16507) - RediSearch/RediSearch#10921 Sort keys with embedded NUL bytes are no longer truncated in replies.
- RediSearch/RediSearch#9963 Trie
RangeIternow preserves the excluded-empty lower bound. (MOD-15897) - RediSearch/RediSearch#10085
RETURN_STRICTsafe-loader no longer deadlocks the GIL on client timeout. (MOD-16267) - RediSearch/RediSearch#11449 Index reference leak after queued search cancellation no longer occurs. (MOD-18682)
- RediSearch/RediSearch#11369 Memory leaks after coordinator
SEARCHcancellation no longer occur. (MOD-18548) - RediSearch/RediSearch#10110
FT.HYBRIDcursor setup now has a bounded channel timeout. (MOD-16145) - RediSearch/RediSearch#10211, RediSearch/RediSearch#10745
RETURN_STRICTcursors are now depleted on timeout; strict-timed-out hybrid cursor cycles drop their cursors at cycle end. (MOD-16091, MOD-16991) - RediSearch/RediSearch#10947 Coordinator cursor memory is now capped via
INDEX_CURSOR_LIMIT. (MOD-17479) - RediSearch/RediSearch#10766, RediSearch/RediSearch#10763 Cursor reads no longer time out against a deadline belonging to an earlier read, and now correctly reports a timeout that expires while iterators are revalidated. (MOD-17489, MOD-17488)
- RediSearch/RediSearch#10993 RDB and replication payloads no longer leak a stray heap byte. (MOD-17800)
- RediSearch/RediSearch#10074
FT.HYBRIDnow returns a stable RRF result order across cluster shards. (MOD-12438) - RediSearch/RediSearch#11027 Cluster TLS connections now use Redis node metadata, aligning with topology changes. (MOD-15869)
- RediSearch/RediSearch#10380, RediSearch/RediSearch#10430 Cluster topology is now refreshed on topology-change events rather than by polling. (MOD-15868, MOD-15870)
- RediSearch/RediSearch#10835 Coordinator fanout now preserves binary argument lengths.
- RediSearch/RediSearch#11095 Replica stalls during
FT.DROPINDEX DDare reduced. - RediSearch/RediSearch#10255 Blocked search clients no longer trigger eager query dumps. (MOD-16518)
- RediSearch/RediSearch#10083 Internal query arguments missing during rolling upgrade are now tolerated. (MOD-16047)
- RediSearch/RediSearch#10816 Forced GC now waits for a concurrent child process instead of skipping its cycle.
- RediSearch/RediSearch#10958 Async disk read pool no longer spins when saturated; it blocks instead.
- RediSearch/RediSearch#10646, RediSearch/RediSearch#10392 VectorSimilarity dependency refreshed to address unaligned metadata access on ARM/SVE paths. (MOD-15303, MOD-16696)
- RediSearch/RediSearch#10352
FT.PROFILE ON_TIMEOUT FAILnow reports a pre-execution timeout as a warning rather than an error. (MOD-16660) - RediSearch/RediSearch#10870 Crash reports now include in-flight coordinator aggregate, hybrid, and cursor-read queries. (MOD-16992)
- RediSearch/RediSearch#11089 Debug aggregate request synchronization no longer crashes. (MOD-17616)
- RediSearch/RediSearch#10063
COLLECT LIMITnow honors the configurablesearch-max-aggregate-results - RedisJSON/RedisJSON#1636 Fixed array-index normalization overflow for extreme negative indexes, including i64::MIN, affecting commands such as
JSON.ARRTRIM - RedisJSON/RedisJSON#1648 Corrected
JSON.MGETkey-spec metadata to identify all key arguments and exclude the trailing JSONPath argument. - RedisJSON/RedisJSON#1670 Fixed downstream compilation when using redis_json_module_create! with the as-library feature and the new RDB depth configuration
- RedisBloom/RedisBloom#1035 TDIGEST.QUANTILE, TDIGEST.CDF, and TDIGEST.TRIMMED_MEAN could return NaN for a sketch containing exactly one observation
- RedisBloom/RedisBloom#1053 RDB loading and RESTORE did not consistently reject invalid numeric values, allocation sizes, serialized counts, or inconsistent metadata in Bloom filters, Count-Min Sketches, Top-K sketches, and t-digests; Bloom filter growth also lacked overflow checks
- RedisBloom/RedisBloom#1053 Top-K sketches containing nonempty items with zero counts or empty-string items with nonzero counts could be restored incorrectly
- RedisBloom/RedisBloom#1067 Bloom filters with excessive hash-function counts could be accepted during loading and restoration, including through BF.LOADCHUNK
- RedisBloom/RedisBloom#1062 CMS.MERGE key metadata did not correctly identify the destination and all source keys, affecting cluster slot validation
- RedisBloom/RedisBloom#1071 CF.COMPACT command metadata was missing its argument count and key specification
Performance and resource utilization improvements
- #15618 Batch updates to hashes using shared templates now run more efficiently
- #15018 Supported x86 systems now use the processor-based monotonic clock by default, with runtime calibration to reduce timing overhead
- #15782 RDB and AOF loading now provides sequential-read hints to the operating system to improve loading efficiency
- RediSearch/RediSearch#10169 Searches on indexes using field-level expiration (
HEXPIRE) are faster. (MOD-16350) - RediSearch/RediSearch#10981, RediSearch/RediSearch#11065 Coordinator field lookup and row-reply serialization overhead is reduced. (MOD-17924)
- RediSearch/RediSearch#11055, RediSearch/RediSearch#11056, RediSearch/RediSearch#11057 Cluster reply conversion, result destruction, and
GROUPBYcleanup have reduced overhead. (MOD-17908, MOD-17909, MOD-17910) - RediSearch/RediSearch#11507, RediSearch/RediSearch#11506 Query replies now format integral numeric values without
snprintfand declare reply collection lengths up front. (MOD-18800, MOD-18799) - RediSearch/RediSearch#11509 Hash field loading for
RETURNandLOADno longer requires per-field allocations. (MOD-18811) - RediSearch/RediSearch#10246 Concurrent writes are now allowed during vector range queries. (MOD-16437)
- RediSearch/RediSearch#10515 Coordinator requests are now allocated on the main thread, removing
CoordRequestCtx. (MOD-16990) - RediSearch/RediSearch#11018 Query usage is now separated from administrative index operations. (MOD-17536)
- RediSearch/RediSearch#10066 Shard response barrier removed in favor of async iterator depletion callback for
FT.AGGREGATE WITHCOUNT. (MOD-16210) - RedisJSON/RedisJSON#1645 More accurate memory usage reporting for shared strings: Memory usage now accounts for each reference’s proportional share of a shared string’s allocation, including its header and padding, instead of charging the full allocation to every reference
- J1660 Reduced object memory consumption: JSON parsing now uses compact object allocation to reduce the actual memory needed to store JSON objects
- RedisJSON/RedisJSON#1661 Improved JSONPath parsing and evaluation by reducing parser backtracking, temporary allocations, and repeated traversal. Optimizations include caching root-path operands across filter candidates, stopping existence checks at the first match, and reducing overhead in regex matching and string comparisons
- RedisJSON/RedisJSON#1631 Improved typed-array element access through direct indexing, avoiding repeated iteration and quadratic work during full indexed scans
- RedisBloom/RedisBloom#1049 Improved t-digest compression performance for inputs containing many duplicate values. Sorting is now bounded to O(n log n), avoiding quadratic behavior on pathological inputs
Configuration parameters
- Redis-roaring:
bitmap-default-roaring- to enable the new roaring bitmaps type, disabled by default - RedisJSON/RedisJSON#1657 Configurable RDB depth validation: Added
json-legacy-rdb-depth-limit, disabled by default, to enforce a maximum nesting depth of 128 when loading JSON from RDB or through RESTORE - RedisJSON/RedisJSON#1640 Added
json-auto-create-deep-pathsand is disabled by default and can only be configured at load time. Use the same value on every node of a shard and when replaying AOF files, because differing values can cause data divergence
Metrics
- #15374
INFOkeysizes histograms now include streams, providing visibility into stream key sizes - #15682 Streams observability – Added
INFO STREAMSwith per-database histograms of consumer groups per stream, pending entries per group, and consumers per group. Enable with stream-stats yes (disabled by default) - RediSearch/RediSearch#10097
FT.INFOnow exposes the defaultEF_RUNTIME. (MOD-16147) - RediSearch/RediSearch#10107 Disk GC
bytes_collectedand cycle stats are now reported inFT.INFO. (MOD-14621) - RediSearch/RediSearch#10464
FT.INFOon coordinator now aggregates per-field disk metrics via the reducer. (MOD-14859) - RediSearch/RediSearch#10204 Redis
INFOnow breaks down query timeout metrics by pipeline stage. (MOD-13192) - RediSearch/RediSearch#11521 Index metrics are no longer collected for unrelated
INFOsections. (MOD-18033) - RediSearch/RediSearch#10536
FT.PROFILEloader-field timing resolution is improved. (MOD-17132)
Behavior changes
- RediSearch/RediSearch#10109
FT.CREATErejectsRERANKon HNSW vector fields in RAM mode. (MOD-16015) - RediSearch/RediSearch#10200 Disk indexes reject
DIALECT 4andWITHOUTCOUNT. (MOD-15997) - RediSearch/RediSearch#10082
COLLECTrequires an@prefix for field names. (MOD-16233) - RediSearch/RediSearch#11106 JSON
HIGHLIGHT/SUMMARIZEfields with multi-value JSONPath are now rejected. (MOD-16530) - RediSearch/RediSearch#10208 Non-cacheable commands are now marked with
dont_cache. (MOD-16175) - RediSearch/RediSearch#10699 Numeric command arguments are now strictly parsed. (MOD-17409)
- RediSearch/RediSearch#11335 Search module now requires Redis 8.9.241 or newer to load. (MOD-15868)
- RedisBloom/RedisBloom#1063 Rejected
CMS.INCRBYitem updates now leave counters and the total count unchanged instead of saturating counters on overflow. Multi-item commands can still partially succeed. RedisBloom/RedisBloom#1063 CMS.MERGEnow requires matching cell sizes across the destination and all sources.
Modules API
- #15517 Modules can now retrieve a cluster node’s TLS port using the new REDISMODULE_NODE_PORT_TLS flag in RM_GetClusterNodeInfo()
- RedisJSON/RedisJSON#1623 Added
getWithPathin shared API V9 to evaluate a precompiled JSONPath, allowing callers to compile a path once and reuse it across documents. - RedisJSON/RedisJSON#1666 Added
pathParseNoErrorMsgin shared API V10 to compile JSONPaths without a Redis context or an allocated error message. Returns a compiled handle on success or NULL on failure. - RedisJSON/RedisJSON#1653 Made pre-command hooks optional and allowed hook errors to abort JSON commands before execution. Hooks now return
RedisResult<()>; shared C API calls continue to ignore hook errors. - RedisJSON/RedisJSON#1640 Extended the Rust Manager interface with clone_value and create_object to support construction of missing paths. Custom implementations must implement these methods and satisfy the new
Borrow<Self::V>requirement for owned values.
Source redis/redis ·
8.12-rc1· 2026-10-29 · upstream release
Mirrored verbatim for indexing. All rights belong to the upstream project.
Release notes are published by the upstream project and mirrored here for indexing. All rights belong to their authors.