Repository navigation
Releases: valkey-io/valkey
Release list
9.1.3
Valkey 9.1.3 - Released Mon 26 October 2026
Upgrade urgency SECURITY: This release includes security fixes we recommend you apply as soon as possible.
Security Fixes
- GHSA-f4q9-j22m-xqq9: Fix a heap buffer overflow in cluster Pub/Sub message construction that could allow an authenticated client to potentially execute arbitrary code by publishing an oversized message by @roshkhatri (#5030)
Bug Fixes
- Fix stream commands that mutate consumer-group or PEL state (
XGROUP,XSETID,XREADGROUP,XACK,XCLAIM,XAUTOCLAIM) not triggeringWATCHand client-side tracking invalidation by @Tarte12 (#3459) - Reject module write commands while the server is paused for writes, preventing a crash from module timer callbacks during
CLIENT PAUSE WRITEorCLUSTER FAILOVERby @smkher (#3645) - Fix event loop busy-spinning on virtual machines by not using raw TSC for the monotonic clock when the kernel clocksource is not tsc by @quanyeyang (#4707)
- Fix a crash in
ValkeyModule_HashHasStringRefon a missing or expired field and correct wrong return values in the hash stringRef module APIs by @ShubhamTaple (#4504) - Fix a server abort on a RESTORE payload declaring a string length that overflows the allocation size; such payloads are now rejected as bad data by @enjoy-binbin (#4733)
- Fix ZINTER/ZINTERSTORE returning input-order-dependent scores when a weighted term is 0*inf; a NaN weighted score now counts as 0, matching ZUNION by @leomurillo (#4997)
- Clear a stale primary-failure gossip flag on replicas so later failovers don't incorrectly skip the election delay by @charsyam (#4533)
- Correct
ValkeyModule_FreeModuleUser,ValkeyModule_ACLAddLogEntryandValkeyModule_ACLAddLogEntryByUserNamedeclarations to return int as implemented, fixing undefined behavior on targets with strict call signature checks by @rainsupreme (#4676) - valkey-check-aof now recognizes RDB base files with the
VALKEYsignature instead of misreporting a valid multipart AOF as invalid by @sarthakaggarwal97 (#4739) - Fix module commands that access undeclared keys in other slots reading or writing the wrong slot in cluster mode, and aborting in debug builds by @patrickswedish (#4424)
- Reject relative expire times in
SET/GETEX,RESTORE, andValkeyModule_SetExpirethat overflow when added to the current time, preventing server aborts from negative expires by @madolson (#4880) HDEL,HGETDEL,HPERSIST, andHEXPIREno longer propagate fields they treat as expired, preventing replica and AOF-reload divergence by @xdk-amz (#4772)- Fix a server crash when loading an ACL file containing a selector with an unmatched parenthesis by @magic-peach (#4214)
- Fix a segfault on Alpine/musl when Lua is built as a module, caused by a symbol clash on an internal clock function by @mohammedgqudah (#4270)
COPYof a hash now includes expired-but-unreaped fields so their deletion is propagated and replicas stay in sync by @pirate329 (#4939)- Restore acceptance of hexadecimal float sorted set scores (such as
0x10), keeping replication and AOF replay compatible with Valkey 9.0 by @quanyeyang (#4875) - Sorted set range commands with a negative
LIMIToffset now return an empty result instead of a spurious element on btree-encoded keys by @xiaocj (#4637) - Fix listpack encoding incompatibility that caused RDB load and replication failures for entries of certain lengths between 9.0 and 9.1.x by @jjuleslasarte (#4819)
- Fix atomic slot migration not replicating evictions on the import target, which let replicas grow far past
maxmemoryby @shanezx-sc (#4920) - Redact error text in server logs when
hide-user-data-from-logis enabled, so command arguments no longer leak into logs by @zackcam (#4815) - Fix
HSETEXandHGETEXfailing to parse their arguments when the key is namedfieldsby @sebxt (#4945) - Fix cluster config saving to avoid publishing truncated
nodes.conffiles, losing the startup lock after the first save, and failing every save on SMB filesystems such as Azure Files; the lock now lives on a separatenodes.conf.lockfile by @KewangZhili (#4489) - Fix
LSETon 64-bit builds silently modifying the wrong element for out-of-range indexes instead of returning an index out of range error by @charsyam (#4823) - Fix atomic slot migration with
cluster-databases> 1 applying writes made during the snapshot to the wrong database on the target by @pirate329 (#4952)
Full Changelog: 9.1.2...9.1.3
9.0.7
Valkey 9.0.7 - Released Mon 26 October 2026
Upgrade urgency SECURITY: This release includes security fixes we recommend you apply as soon as possible.
Security Fixes
- GHSA-f4q9-j22m-xqq9: Fix a heap buffer overflow in cluster Pub/Sub message construction that could allow an authenticated client to potentially execute arbitrary code by publishing an oversized message by @roshkhatri (#5030)
Bug Fixes
- Fix stream commands that mutate consumer-group or PEL state (
XGROUP,XSETID,XREADGROUP,XACK,XCLAIM,XAUTOCLAIM) not triggeringWATCHand client-side tracking invalidation by @Tarte12 (#3459) - Reject module write commands while the server is paused for writes, preventing a crash from module timer callbacks during
CLIENT PAUSE WRITEorCLUSTER FAILOVERby @smkher (#3645) - Fix a server abort on a RESTORE payload declaring a string length that overflows the allocation size; such payloads are now rejected as bad data by @enjoy-binbin (#4733)
- Fix ZINTER/ZINTERSTORE returning input-order-dependent scores when a weighted term is 0*inf; a NaN weighted score now counts as 0, matching ZUNION by @leomurillo (#4997)
- Correct
ValkeyModule_FreeModuleUser,ValkeyModule_ACLAddLogEntryandValkeyModule_ACLAddLogEntryByUserNamedeclarations to return int as implemented, fixing undefined behavior on targets with strict call signature checks by @rainsupreme (#4676) - valkey-check-aof now recognizes RDB base files with the
VALKEYsignature instead of misreporting a valid multipart AOF as invalid by @sarthakaggarwal97 (#4739) - Fix a huge memory allocation when a command such as COMMAND GETKEYS EVAL declares a far larger key count than the arguments provided by @murphyjacob4 (#3598)
- Reject relative expire times in
SET/GETEX,RESTORE, andValkeyModule_SetExpirethat overflow when added to the current time, preventing server aborts from negative expires by @madolson (#4880) HDEL,HGETDEL,HPERSIST, andHEXPIREno longer propagate fields they treat as expired, preventing replica and AOF-reload divergence by @xdk-amz (#4772)- Fix a server crash when loading an ACL file containing a selector with an unmatched parenthesis by @magic-peach (#4214)
COPYof a hash now includes expired-but-unreaped fields so their deletion is propagated and replicas stay in sync by @pirate329 (#4939)- Sorted set range commands with a negative
LIMIToffset now return an empty result instead of a spurious element on btree-encoded keys by @xiaocj (#4637) - Fix atomic slot migration not replicating evictions on the import target, which let replicas grow far past
maxmemoryby @shanezx-sc (#4920) - Redact error text in server logs when
hide-user-data-from-logis enabled, so command arguments no longer leak into logs by @zackcam (#4815) - Fix
HSETEXandHGETEXfailing to parse their arguments when the key is namedfieldsby @sebxt (#4945) - Fix cluster config saving to avoid publishing truncated
nodes.conffiles, losing the startup lock after the first save, and failing every save on SMB filesystems such as Azure Files; the lock now lives on a separatenodes.conf.lockfile by @KewangZhili (#4489) - Fix atomic slot migration with
cluster-databases> 1 applying writes made during the snapshot to the wrong database on the target by @pirate329 (#4952) - Fix
LSETon 64-bit builds silently modifying the wrong element for out-of-range indexes instead of returning an index out of range error by @charsyam (#4823)
Full Changelog: 9.0.6...9.0.7
8.1.11
Valkey 8.1.11 - Released Mon 26 October 2026
Upgrade urgency SECURITY: This release includes security fixes we recommend you apply as soon as possible.
Security Fixes
- GHSA-f4q9-j22m-xqq9: Fix a heap buffer overflow in cluster Pub/Sub message construction that could allow an authenticated client to potentially execute arbitrary code by publishing an oversized message by @roshkhatri (#5030)
Bug Fixes
- Fix stream commands that mutate consumer-group or PEL state (
XGROUP,XSETID,XREADGROUP,XACK,XCLAIM,XAUTOCLAIM) not triggeringWATCHand client-side tracking invalidation by @Tarte12 (#3459) - Fix a server crash when module timer callbacks or thread-safe contexts attempt writes while writes are paused by
CLIENT PAUSE WRITEorCLUSTER FAILOVER; such module writes are now rejected by @smkher (#3645) - Fix a server abort on a RESTORE payload declaring a string length that overflows the allocation size; such payloads are now rejected as bad data by @enjoy-binbin (#4733)
- Fix ZINTER/ZINTERSTORE returning input-order-dependent scores when a weighted term is 0*inf; a NaN weighted score now counts as 0, matching ZUNION by @leomurillo (#4997)
- Correct
ValkeyModule_FreeModuleUser,ValkeyModule_ACLAddLogEntryandValkeyModule_ACLAddLogEntryByUserNamedeclarations to return int as implemented, fixing undefined behavior on targets with strict call signature checks by @rainsupreme (#4676) - Fix a huge memory allocation when a command such as COMMAND GETKEYS EVAL declares a far larger key count than the arguments provided by @murphyjacob4 (#3598)
- Reject relative expire times in
SET/GETEX,RESTORE, and the moduleSetExpireAPI that overflow when the current time is added, preventing negative expires that abort the server by @madolson (#4880) - Fix a server crash when loading an ACL file containing a selector with an unmatched parenthesis by @magic-peach (#4214)
- Fix sorted set range commands with a negative LIMIT offset returning a wrong element on btree-encoded keys; negative offsets now return an empty result in both encodings by @xiaocj (#4637)
- Redact error reply text in server logs when
hide-user-data-from-logis enabled, so keys and values no longer leak into logs via error messages by @zackcam (#4815) - Fix cluster config saving to avoid publishing truncated
nodes.conffiles, losing the startup lock after the first save, and failing every save on SMB filesystems such as Azure Files; the lock now lives on a separatenodes.conf.lockfile by @KewangZhili (#4489) - Fix
LSETon 64-bit builds silently modifying the wrong element for out-of-range indexes instead of returning an index out of range error by @charsyam (#4823)
Full Changelog: 8.1.10...8.1.11
8.0.12
Valkey 8.0.12 - Released Mon 26 October 2026
Upgrade urgency SECURITY: This release includes security fixes we recommend you apply as soon as possible.
Security Fixes
- GHSA-f4q9-j22m-xqq9: Fix a heap buffer overflow in cluster Pub/Sub message construction that could allow an authenticated client to potentially execute arbitrary code by publishing an oversized message by @roshkhatri (#5030)
Bug Fixes
- Fix stream commands that mutate consumer-group or PEL state (
XGROUP,XSETID,XREADGROUP,XACK,XCLAIM,XAUTOCLAIM) not triggeringWATCHand client-side tracking invalidation by @Tarte12 (#3459) - Fix a server abort on a RESTORE payload declaring a string length that overflows the allocation size; such payloads are now rejected as bad data by @enjoy-binbin (#4733)
- Reject module write commands while the server is paused for writes, preventing a crash from module timer callbacks during
CLIENT PAUSE WRITEorCLUSTER FAILOVERby @smkher (#3645) - Fix ZINTER/ZINTERSTORE returning input-order-dependent scores when a weighted term is 0*inf; a NaN weighted score now counts as 0, matching ZUNION by @leomurillo (#4997)
- Correct
ValkeyModule_FreeModuleUser,ValkeyModule_ACLAddLogEntryandValkeyModule_ACLAddLogEntryByUserNamedeclarations to return int as implemented, fixing undefined behavior on targets with strict call signature checks by @rainsupreme (#4676) - Fix valkey-benchmark spinning on would-block writes, which could starve reply processing and the
--durationtimer by @thweetkomputer (#4567) - Fix a huge memory allocation when a command such as COMMAND GETKEYS EVAL declares a far larger key count than the arguments provided by @murphyjacob4 (#3598)
- Reject relative expire times in
SET/GETEX,RESTORE, andValkeyModule_SetExpirethat overflow when added to the current time, preventing server aborts from negative expires by @madolson (#4880) - Fix a server crash when loading an ACL file containing a selector with an unmatched parenthesis by @magic-peach (#4214)
- Sorted set range commands with a negative
LIMIToffset now return an empty result instead of a spurious element on btree-encoded keys by @xiaocj (#4637) - Redact error text in server logs when
hide-user-data-from-logis enabled, so command arguments no longer leak into logs by @zackcam (#4815) - Fix cluster config saving to avoid publishing truncated
nodes.conffiles, losing the startup lock after the first save, and failing every save on SMB filesystems such as Azure Files; the lock now lives on a separatenodes.conf.lockfile by @KewangZhili (#4489) - Fix
LSETon 64-bit builds silently modifying the wrong element for out-of-range indexes instead of returning an index out of range error by @charsyam (#4823)
Full Changelog: 8.0.11...8.0.12
7.2.15
Valkey 7.2.15 - Released Mon 26 October 2026
Upgrade urgency SECURITY: This release includes security fixes we recommend you apply as soon as possible.
Security Fixes
- GHSA-f4q9-j22m-xqq9: Fix a heap buffer overflow in cluster Pub/Sub message construction that could allow an authenticated client to crash the server or potentially execute arbitrary code by publishing an oversized message by @roshkhatri (#5030)
Bug Fixes
- Fix a double-free crash when a module timer callback stops its own timer with
ValkeyModule_StopTimerby @quanyeyang (#4211) - Truncate a partially written MULTI block from the AOF on short read, preventing loss of newer writes after a later restart by @chzhoo (#4342)
- Fix an ACL bypass where duplicate STORE/STOREDIST options let GEORADIUS write or delete keys outside the user's permitted patterns by @tjade273 (#3971)
- Fix a use-after-free crash when a module's cluster message type is received after the module is unloaded by @enjoy-binbin (#4360)
- Fix out-of-bounds access for cluster module message type 255, which is now a valid, dispatchable message type by @enjoy-binbin (#4410)
- AOF loading no longer performs ACL checks on replayed commands, preventing silent data loss when the default user is disabled by @lukepalmer (#3984)
- Listpacks are now always validated on RDB load and RESTORE, preventing deferred assertion crashes;
sanitize-dump-payloadand its ACL flags become no-ops by @jjuleslasarte (#3721) - Fix a client memory accounting leak on replicas that inflated the
mem_clients_normalINFO field after primary disconnections by @enjoy-binbin (#4395) - Fix stream commands that mutate consumer-group or PEL state (
XGROUP,XSETID,XREADGROUP,XACK,XCLAIM,XAUTOCLAIM) not triggeringWATCHand client-side tracking invalidation by @Tarte12 (#3459) - Fix a server abort on a RESTORE payload declaring a string length that overflows the allocation size; such payloads are now rejected as bad data by @enjoy-binbin (#4733)
- Fix ZINTER/ZINTERSTORE returning input-order-dependent scores when a weighted term is 0*inf; a NaN weighted score now counts as 0, matching ZUNION by @leomurillo (#4997)
- Harden stream validation on RDB load and RESTORE so crafted payloads can no longer crash the server on later commands by @madolson (#3922)
- Fix a use-after-free crash when serving clients blocked on the same key if one client is freed during processing by @quanyeyang (#4212)
- Fix a stack overflow crash in TLS connections when retrying a large write after a write failure by @murphyjacob4 (#4307)
- Fix a crash from forged cluster bus PUBLISH or MODULE packets declaring payload lengths that exceed the packet size by @tjade273 (#3972)
- Correct
ValkeyModule_FreeModuleUser,ValkeyModule_ACLAddLogEntryandValkeyModule_ACLAddLogEntryByUserNamedeclarations to return int as implemented, fixing undefined behavior on targets with strict call signature checks by @rainsupreme (#4676) - Fix valkey-benchmark spinning on would-block writes, which could starve reply processing and the
--durationtimer by @thweetkomputer (#4567) - Fix a huge memory allocation when a command such as COMMAND GETKEYS EVAL declares a far larger key count than the arguments provided by @murphyjacob4 (#3598)
- Reject stream payloads with mismatched live/deleted record counts, preventing XDEL from destroying unaccounted entries by @roshkhatri (#4381)
- Fix a server crash when loading an ACL file containing a selector with an unmatched parenthesis by @magic-peach (#4214)
- Fix cluster config saving to avoid publishing truncated
nodes.conffiles, losing the startup lock after the first save, and failing every save on SMB filesystems such as Azure Files; the lock now lives on a separatenodes.conf.lockfile by @KewangZhili (#4489) - Fix
LSETon 64-bit builds silently modifying the wrong element for out-of-range indexes instead of returning an index out of range error by @charsyam (#4823)
Full Changelog: 7.2.14...7.2.15
9.2.0-rc1
Valkey 9.2.0-rc1 - Released Wed 16 September 2026
Upgrade urgency LOW: This is the first release candidate of Valkey 9.2.0.
Behavior Changes
- Active expiration of keys and hash fields now increments the dirty counter, so save points (and thus BGSAVE) may trigger more often by @enjoy-binbin (#3118)
New Features and Enhanced Behavior
- Add ACL DIGEST command that returns a fingerprint of the ACL rules currently in effect, useful to verify what ACL LOAD applied by @melancholictheory (#4446)
- Add forkless RDB snapshots, opt-in via the new
forkless-infrastructure-enabledandbgsave-default-methodconfigs, with new INFO persistence fields reporting the save method and progress by @JimB123 (#4460) - Add the
XACKDELandXDELEXstream commands withKEEPREF,DELREFandACKEDmodes to acknowledge and delete messages once consumer groups no longer need them by @nickiaq (#4629) - Support a secondary server certificate via
tls-alt-cert-file,tls-alt-key-fileandtls-alt-key-file-pass, e.g. a post-quantum certificate alongside RSA, with matching INFO TLS fields by @pkhartsk (#3717) - Add ACL roles: named, reusable sets of ACL selectors managed with
ACL SETROLE/DELROLE/GETROLE/ROLESand assigned to users withrole:<name>, in commands, the ACL file and valkey.conf by @yang-z-o (#3967) - Add a
maxmemory-scriptsconfig to limit memory used by cachedEVALscripts, and markSCRIPT LOADas DENYOOM so it respects the global maxmemory limit by @enjoy-binbin (#866) - Add Path Hash, a new radix-tree-backed data type with
PH*commands for exact lookup, longest-prefix matching, and prefix traversal over binary-safe paths by @yangbodong22011 (#4506) - Support whole-stream LZ4 compression of RDB files via the new
rdbcompression lz4option; the default per-string LZF behavior is unchanged by @sarthakaggarwal97 (#3531) - Add server-side hot key detection with new
HOTKEYS GET/RESETcommands, enabled by settinghotkeys-top-kby @alon-arenberg (#3708) - Add optional replication throttling (
repl-throttling-enabled) that slows client writes when a replica falls behind, avoiding disconnects and full syncs by @harrylin98 (#4356) - Prioritize system-critical events (cluster heartbeats, replication, slot migration) over heavy client traffic, tunable via the new
priority-preemptive-poll-interval-usconfig by @satheeshaGowda (#4076) - Reserve connection slots for administrative clients: connections from the CIDR ranges listed in the new
priority-subnetsconfig are tagged as prioritized,maxclients-reservedcaps normal clients atmaxclientsminus that many slots, andINFO clientsreportsconnected_priority_clientsby @satheeshaGowda (#4005) - Add
INCREXcommand to atomically increment a key by an integer or float while setting its expiration, withNX/XXconditions by @GavinDmello (#3253)
Performance and Efficiency Improvements
- Speed up radix tree lookups and inserts by using SIMD-optimized memchr() for child-edge search by @charsyam (#3472)
- Improve replica processing speed by parsing multiple commands from the replication stream at once by @enjoy-binbin (#3597)
- Reduce memory usage by sharing pubsub pattern and WATCH key objects across clients subscribing to or watching the same name by @enjoy-binbin (#4072)
- Large sorted sets are now backed by a B+ tree instead of a skiplist; OBJECT ENCODING reports
btreeinstead ofskiplistby @ranshid (#4359) - Save the cluster config file from a background thread when
cluster-config-save-behavioris best-effort, avoiding main-thread latency spikes from slow disk I/O by @enjoy-binbin (#2555) - Speed up
HMGET,SMISMEMBERandZMSCOREon large hashtable-encoded keys with batched lookups that overlap memory accesses by @chzhoo (#4017) - Extend memory prefetching to hash, set and sorted set member lookups when io-threads are enabled, improving performance for 30 field/member commands on large keys by @roshkhatri (#3940)
MEMORY PURGEnow also releases free pages from the glibc main arena back to the OS, reclaiming memory held by libc-internal allocations by @webbsssss (#3640)- Speed up command propagation to replicas by batching each command's RESP frame into a single replication buffer write by @hpatro (#4044)
- Reduce lseek system calls during disk-based replication by seeking only when a write blocks or is partial by @enjoy-binbin (#4053)
- Reduce event-loop overhead by refreshing cached daylight-saving info once per second instead of on every wakeup by @hpatro (#4086)
- Speed up keyspace event notifications by skipping work when there are no subscribers and avoiding unnecessary allocations by @enjoy-binbin (#4285)
- Speed up exact
XTRIM MAXLEN = 0by about 2.5x by clearing the whole stream in one step instead of removing entries individually by @sarthakaggarwal97 (#4161) - Cluster bus reads, writes, and inbound TLS accepts can now run on the shared I/O thread pool, with new
CLUSTER INFOoffload statistics by @hpatro (#3438) - Small hashes with field expiration now use the memory-efficient listpack encoding instead of always converting to a hashtable by @frostzt (#3212)
- Reduce per-command overhead by skipping post-command bookkeeping when no propagation, module, or invalidation work is pending by @ahmetalicc (#4257)
Bug Fixes
- MODULE LOAD is now rejected during async replication loading and atomic slot migration to avoid unexpected module behavior by @KIvanow (#3039)
- Reject CLUSTER ADDSLOTS/DELSLOTS/ADDSLOTSRANGE/DELSLOTSRANGE/FLUSHSLOTS on replicas, preventing an assertion failure on a later CLUSTER REPLICATE by @enjoy-binbin (#4020)
- Fix a crash when processing a heartbeat from a cluster node whose role is locally unknown, such as after loading an incomplete nodes.conf by @enjoy-binbin (#4091)
- Fix wrong results or debug-build assertions in cluster mode when the server inspects keys outside the executing command's slot, such as WATCHed keys checked during EXEC by @nitaicaro (#4380)
- Fix stream commands that mutate consumer-group or PEL state (
XGROUP,XSETID,XREADGROUP,XACK,XCLAIM,XAUTOCLAIM) not triggeringWATCHand client-side tracking invalidation by @Tarte12 (#3459) - Fix a server crash on FUNCTION DELETE or FUNCTION LOAD REPLACE after loading a library with function names differing only in case by @madolson (#3925)
- Client-side tracking no longer records routing-only tokens such as the CLUSTERSCAN cursor as tracked keys by @nmvk (#3699)
- Reject malformed slot entries in the cluster config file as a corrupt config instead of asserting or invoking undefined behavior by @enjoy-binbin (#4100)
- Fix a TLS busy loop that consumed 100% CPU when a connection's read or write handler was removed while OpenSSL was waiting for the opposite event by @yairgott (#3510)
- Client eviction no longer disconnects extra clients when a large client's close is deferred but its memory is already scheduled to be freed by @dhruv2x (#4152)
- Fix a crash caused by a NULL pointer dereference when all timer events in an event loop are pending deletion by @royenheart (#4351)
- Rework iteration over clients blocked on ready keys to simplify and harden an earlier use-after-free fix by @enjoy-binbin (#4472)
- Fix a race in RDB string compression that could produce corrupt, unloadable RDB files when compression runs concurrently, without increasing copy-on-write by @dubey02 (#4539)
- Fix dropped field TTLs and a possible crash when loading a hash with field expiration converts it to a hashtable mid-load (e.g. via RESTORE) by @madolson (#4669)
- Reject a repeated
CLUSTER SYNCSLOTS ESTABLISHon the same connection, which could lead to a use-after-free crash on disconnect by @Pyolar (#4670) - Fix wrong
ZCOUNTresults and incorrectZREMRANGEBYSCOREdeletions when members sharing a boundary score span multiple btree leaves by @rainsupreme (#4554) - Fix
SORTkey extraction so aSTOREdestination named like an option can no longer bypass ACL checks and write to an unauthorized key by @madolson (#4665)
Command and API Updates
MOVEaccepts a new optionalREPLACEargument to overwrite an existing key in the destination database by @bandalgomsu (#2993)- WAIT and WAITAOF now reject numreplicas values that are negative or exceed INT_MAX, fixing an integer overflow that broke blocking by @enjoy-binbin (#3407)
- Add CONFIG INFO subcommand returning config metadata such as type, flags, valid enum values and numeric ranges by @nitaicaro (#3050)
- Add the
IFNEoption toSETto set a key only when its current value differs from the given comparison value by @arshidkv12 (#3105) - Add
IFEQ,IFNE,NXandXXconditions toEXEC, enabling optimistic locking for multi-key transactions withoutWATCHby @bandalgomsu (#4019) - Add an optional
XXflag toSISMEMBERthat returns -1 when the key does not exist, distinguishing a missing key from a missing member by @li-benson (#2972) - Handle NOT_KEY key-specs more defensively so COMMAND GETKEYS and ACL key checks consistently treat routing-only tokens as non-keys by @enjoy-binbin (#3675)
- Fix DEBUG HELP to show the correct DELAY-RDB-CLIENT-FREE-SECONDS name and document the SET-DISABLE-DENY-SCRIPTS subcommand by @xiejing-dev (#4099)
- Add XX option to the ZRANGE family of commands to distinguish a non-existent key (nil) from an empty result by @youngmore1024 (#2978)
- Fix the reply schemas of the ZRANGE family of commands to allow the null reply returned with the XX option by @murphyjacob4 (#4275)
- Fix the
XPENDINGreply schema to describe the summary reply returned when a consumer group has no pending messages by @sarthakaggarwal97 (#4653)
Cluster and Replication
9.0.6
Valkey 9.0.6 - Released Tue 01 September 2026
Upgrade urgency SECURITY: This release includes security fixes we recommend you apply as soon as possible.
Security Fixes
- GHSA-jcj7-v34w-v9vv: Fix a use-after-free in RDMA connection handling that could allow an authenticated client to crash the server using CLIENT KILL. Only affects servers built with USE_RDMA and configured with an RDMA listener (#4534)
Bug Fixes
- Fix crashes, assertion failures, and hangs when using RDMA together with IO threads by @quanyeyang (#3335)
- Fix a double free when a module timer callback stops its own timer with ValkeyModule_StopTimer by @quanyeyang (#4211)
- Fix torn RESP3 push frames when a client publishes a large message to a channel it is also subscribed to by @quanyeyang (#4253)
- RESET now clears CLIENT IMPORT-SOURCE state so reused pooled connections regain normal key expiration semantics by @tjade273 (#3973)
- Truncated AOF files now discard an incomplete MULTI block entirely, preventing loss of later writes after another restart by @chzhoo (#4342)
- Fix an ACL bypass in GEORADIUS and GEORADIUSBYMEMBER where duplicate STORE options checked only the first destination key by @tjade273 (#3971)
- Fix a use-after-free crash when a cluster message arrives for a message type registered by an unloaded module by @enjoy-binbin (#4360)
- Always deep-validate payloads on RDB load and RESTORE, preventing deferred assertion crashes; sanitize-dump-payload is now a deprecated no-op by @jjuleslasarte (#3721)
- Fix out-of-bounds memory access when registering or receiving cluster module messages of type 255, which is now a valid type by @enjoy-binbin (#4410)
- AOF loading no longer applies ACL checks, preventing silent data loss when replaying commands with a disabled default user by @lukepalmer (#3984)
- Fix a client memory accounting leak that inflated the mem_clients_normal INFO field on replicas after primary disconnects by @enjoy-binbin (#4395)
- Fix a permanent client hang when a blocking command such as BLPOP is pipelined with a partially received next command by @foobar (#4531)
- HGETEX now requires write permission on the key, so read-only ACL users can no longer change field TTLs or delete fields by @ranshid (#4576)
- Compare the full TLS certificate CN when authenticating, so an embedded NUL cannot impersonate a truncated ACL username by @madolson (#4577)
- Restore read performance with IO threads on TCP/TLS by applying extra read-completion handling only to RDMA connections by @quanyeyang (#4414)
- Restore write performance with IO threads on TCP/TLS by limiting post-write safety checks to RDMA connections by @quanyeyang (#4452)
- Fix atomic slot migration protocol errors with IO threads by not offloading export connection writes while snapshotting by @satheeshaGowda (#4104)
- Reject invalid slot import ranges when loading an RDB, preventing corrupted files from creating bad migration state by @enjoy-binbin (#4229)
- Reject RDB slot-import records with an invalid job name length, fixing an out-of-bounds read during startup by @quanyeyang (#4210)
- Fix a crash when COPY ends with a bare DB token during slot migration, and block cross-DB COPY regardless of option order by @madolson (#4301)
- HPERSIST, HTTL, HPTTL, HEXPIRETIME, and HPEXPIRETIME now return a syntax error when the FIELDS keyword is missing by @cjx-zar (#4300)
- Fix a TLS and IO threads race that could leave slot migration export jobs stuck until timeout by @jjuleslasarte (#4320)
- Fix a server crash when hash field expirations are set near the maximum timestamp, for example via HPEXPIREAT by @ranshid (#4312)
- Fix a stack overflow crash on TLS connections when retrying a failed write of large replies by @murphyjacob4 (#4307)
- Validate cluster bus PUBLISH and MODULE packet payload lengths, preventing a remote crash from forged length fields by @tjade273 (#3972)
- Fix a use-after-free crash when serving blocked clients if handling one client frees another blocked on the same key by @quanyeyang (#4212)
- Fix a server panic with IO threads when pipelined commands with a wrong number of arguments reached the key prefetcher by @madolson (#4302)
- Reject crafted stream RESTORE and RDB payloads with inconsistent lengths or negative field counts that could crash the server by @madolson (#3922)
- Reject stream payloads with mismatched live and deleted entry counts that could make XDEL destroy live entries by @roshkhatri (#4381)
- Fix CLUSTER SLOT-STATS ORDERBY returning wrong ordering once cumulative slot counters differ by more than 2^31 by @jzy1688 (#4459)
- Fix atomic slot migration failures with TLS and IO threads by not offloading export connection reads while snapshotting by @satheeshaGowda (#4559)
Full Changelog: 9.0.5...9.0.6
9.1.2
Valkey 9.1.2 - Released Mon 31 August 2026
Upgrade urgency SECURITY: This release includes security fixes we recommend you apply as soon as possible.
Security Fixes
- GHSA-jcj7-v34w-v9vv: Fix a use-after-free in RDMA connection handling that could allow an authenticated client to crash the server using CLIENT KILL. Only affects servers built with USE_RDMA and configured with an RDMA listener (#4534)
- GHSA-fq2f-crmw-q97r: Fix an unauthenticated use-after-free of the Lua interpreter state, caused by a process-global script debugger command table that cached a raw pointer to a freed interpreter and was never invalidated (#4574)
Bug Fixes
- Fix a double-free crash when a module timer callback stops its own timer with
ValkeyModule_StopTimerby @quanyeyang (#4211) - Fix torn RESP3 push frames when a client publishes to a channel it is also subscribed to, which could desync client libraries by @quanyeyang (#4253)
- Listpacks are now always validated on RDB load and RESTORE, preventing deferred assertion crashes;
sanitize-dump-payloadand its ACL flags become no-ops by @jjuleslasarte (#3721) - Fix crashes, hangs, and CPU spinning when the RDMA transport is used together with I/O threads by @quanyeyang (#3611)
- RESET now clears the
CLIENT IMPORT-SOURCEflag, so reused pooled connections return to normal expiration semantics by @tjade273 (#3973) - Truncate a partially written MULTI block from the AOF on short read, preventing loss of newer writes after a later restart by @chzhoo (#4342)
- Fix an ACL bypass where duplicate STORE/STOREDIST options let GEORADIUS write or delete keys outside the user's permitted patterns by @tjade273 (#3971)
- Fix command log redaction leaking between commands in a MULTI transaction and missing for commands executed from scripts by @madolson (#4323)
- Fix a use-after-free crash when a module's cluster message type is received after the module is unloaded by @enjoy-binbin (#4360)
- Fix out-of-bounds access for cluster module message type 255, which is now a valid, dispatchable message type by @enjoy-binbin (#4410)
- AOF loading no longer performs ACL checks on replayed commands, preventing silent data loss when the default user is disabled by @lukepalmer (#3984)
- Fix a client memory accounting leak on replicas that inflated the
mem_clients_normalINFO field after primary disconnections by @enjoy-binbin (#4395) - Fix a permanent client deadlock when a blocking command like BLPOP is followed by a partially delivered pipelined command by @foobar (#4531)
- HGETEX now requires write permission on the key, closing an ACL gap that let read-only users change field TTLs or delete fields by @ranshid (#4576)
- Compare the whole TLS certificate CN during authentication, so an embedded NUL can no longer impersonate another ACL user by @madolson (#4577)
- Fix atomic slot migration failures with I/O threads by not offloading the export job's writes while snapshotting by @satheeshaGowda (#4104)
- Reject invalid slot import ranges when loading an RDB, so corrupted files can no longer create bad migration jobs by @enjoy-binbin (#4229)
- Reject RDB slot import records with an invalid job name length, preventing an out-of-bounds read at startup by @quanyeyang (#4210)
- MOVE and COPY now check ACL access to the current database, so users can no longer exfiltrate keys from an unauthorized DB by @cjx-zar (#4155)
- Fix a crash on COPY with a trailing DB option during slot migration, and block cross-DB COPY regardless of option order by @madolson (#4301)
- Fix a server panic when pipelined commands with invalid arity reach the key prefetcher with I/O threads enabled by @madolson (#4302)
- HPERSIST, HTTL, HPTTL, HEXPIRETIME, and HPEXPIRETIME now return a syntax error when the FIELDS keyword is missing by @cjx-zar (#4300)
- Fix a race between TLS I/O-thread writes and reads that could leave slot migration export jobs stuck until timeout by @jjuleslasarte (#4320)
- Fix a signed overflow that let very large hash field expiration times (e.g. via HPEXPIREAT) crash the server by @ranshid (#4312)
- Fix a frozen monotonic clock on hosts with unsynchronized TSC that stopped background tasks and key expiration by @quanyeyang (#4346)
- Fix a stack overflow crash when retrying a failed TLS write with a large reply by @murphyjacob4 (#4307)
- Fix the
--check-systemclocksource check to skip hosts using a hardware clock and suggest only actually available clocksources by @quanyeyang (#4272) - Fix an assertion failure with I/O threads when a blocked client's pending command was processed again before unblocking by @quanyeyang (#4376)
- Sentinel no longer loads the built-in Lua scripting engine, removing a spurious warning at startup by @enjoy-binbin (#4327)
- Validate channel, message, and module payload lengths in cluster bus packets, preventing forged packets from crashing nodes by @tjade273 (#3972)
- Harden stream validation on RDB load and RESTORE so crafted payloads can no longer crash the server on later commands by @madolson (#3922)
- Reject stream payloads with mismatched live/deleted record counts, preventing XDEL from destroying unaccounted entries by @roshkhatri (#4381)
- Skip unnecessary post-read processing with I/O threads on socket and TLS connections, restoring small-payload throughput by @quanyeyang (#4401)
- Fix a use-after-free crash when serving clients blocked on the same key if one client is freed during processing by @quanyeyang (#4212)
- Avoid an unneeded client lookup per write completion with I/O threads on socket and TLS connections, improving pipelined throughput by @dgershko (#4440)
- Fix CLUSTER SLOT-STATS ORDERBY returning wrong ordering when slot counters differ by more than 2^31 by @jzy1688 (#4459)
- Fix slot migration failures with I/O threads and TLS by keeping the export job's ACK reads on the main thread while snapshotting by @satheeshaGowda (#4559)
Full Changelog: 9.1.1...9.1.2
8.1.10
Valkey 8.1.10 - Released Mon 31 August 2026
Upgrade urgency SECURITY: This release includes security fixes we recommend you apply as soon as possible.
Security Fixes
- GHSA-jcj7-v34w-v9vv: Fix a use-after-free in RDMA connection handling that could allow an authenticated client to crash the server using CLIENT KILL. Only affects servers built with USE_RDMA and configured with an RDMA listener (#4534)
Bug Fixes
- Fix a double free when a module timer callback stops its own timer with
ValkeyModule_StopTimerby @quanyeyang (#4211) - RESET now clears the
CLIENT IMPORT-SOURCEflag so reused pooled connections stop reading logically expired keys by @tjade273 (#3973) - Fix AOF recovery of a truncated MULTI/EXEC block that could cause new writes to be lost after a subsequent restart by @chzhoo (#4342)
- Fix an ACL bypass where duplicate STORE/STOREDIST options in GEORADIUS commands escaped key write permission checks by @tjade273 (#3971)
- Fix a use-after-free crash when a cluster message of a module-registered type arrives after the module is unloaded by @enjoy-binbin (#4360)
- Fix out-of-bounds access when registering or receiving cluster module messages of type 255, which is now fully supported by @enjoy-binbin (#4410)
- Skip ACL permission checks when replaying the AOF, preventing silent data loss when users are restricted or disabled by @lukepalmer (#3984)
- Fix a client memory accounting leak that inflated
mem_clients_normalon replicas after disconnecting from the primary by @enjoy-binbin (#4395) - Always validate listpacks on RDB load and RESTORE to prevent deferred crashes;
sanitize-dump-payloadand the related ACL flags are now deprecated no-ops by @jjuleslasarte (#3721) - Fix a stack overflow crash when retrying large TLS writes after an OpenSSL write error by @murphyjacob4 (#4307)
- Validate PUBLISH and MODULE cluster bus packet lengths, preventing a crash from forged packets with oversized payload lengths by @tjade273 (#3972)
- Reject crafted stream RESTORE/RDB payloads with inconsistent lengths or negative field counts that could crash the server by @madolson (#3922)
- Fix a use-after-free crash when serving multiple clients blocked on the same key if one is freed during processing by @quanyeyang (#4212)
- Fix CLUSTER SLOT-STATS ORDERBY sorting when slot statistics differ by more than 2^31 by @jzy1688 (#4459)
Full Changelog: 8.1.9...8.1.10
8.0.11
Valkey 8.0.11 - Released Mon 31 August 2026
Upgrade urgency SECURITY: This release includes security fixes we recommend you apply as soon as possible.
Security Fixes
- GHSA-jcj7-v34w-v9vv: Fix a use-after-free in RDMA connection handling that could allow an authenticated client to crash the server using CLIENT KILL. Only affects servers built with USE_RDMA and configured with an RDMA listener (#4534)
Bug Fixes
- Fix a double-free crash when a module timer callback stops its own timer with
ValkeyModule_StopTimerby @quanyeyang (#4211) - Fix AOF truncation after a partially persisted MULTI/EXEC block so writes made after recovery are not lost on a later restart by @chzhoo (#4342)
- Fix an ACL bypass where duplicate STORE/STOREDIST options in GEORADIUS commands let users write keys outside their permitted patterns by @tjade273 (#3971)
- Fix a use-after-free crash when a cluster message for a module-registered type arrives after the module is unloaded by @enjoy-binbin (#4360)
- Fix out-of-bounds access on cluster module messages of type 255, which is now a valid message type by @enjoy-binbin (#4410)
- Fix silent data loss where ACL checks were wrongly applied to commands replayed from the AOF file by @lukepalmer (#3984)
- Fix a client memory accounting leak that inflated the
mem_clients_normalINFO field on replicas by @enjoy-binbin (#4395) - Always deep-validate listpack payloads on RDB load and RESTORE, preventing deferred assertion crashes;
sanitize-dump-payloadis deprecated and now a no-op by @jjuleslasarte (#3721) - Fix module
VM_Yieldtiming so repeated yields honorbusy-reply-thresholdinstead of the server hz interval by @PingXie (#2131) - Fix a stack overflow crash when a large TLS write is retried after an OpenSSL write error by @murphyjacob4 (#4307)
- Fix a crash caused by forged cluster bus PUBLISH or MODULE packets carrying oversized payload length fields by @tjade273 (#3972)
- Reject crafted stream payloads in RDB load and RESTORE whose length or field-count metadata is inconsistent, preventing later server panics by @madolson (#3922)
- Fix a cluster link disconnect loop after network failures that caused pub/sub messages between nodes to be lost by @dvkashapov (#2817)
- Fix a use-after-free crash when a client blocked on a key is freed while other clients blocked on the same key are being served by @quanyeyang (#4212)
- Reject crafted stream payloads that misstate live and deleted record counts, preventing data loss on XDEL by @roshkhatri (#4381)
- Fix incorrect
CLUSTER SLOT-STATS ORDERBYordering when slot statistics differ by more than 2^31 by @jzy1688 (#4459)
Full Changelog: 8.0.10...8.0.11