What dragonflydb/dragonfly shipped
Written by FoxPlug from the repository's own releases; not affiliated with Dragonflydb. Paste your own repository in the box below and FoxPlug writes the same weekly update for your product. This page is an automatic summary of the releases, pull requests and commits in github.com/dragonflydb/dragonfly; Dragonflydb did not write it and does not use or endorse FoxPlug. Every line links to the change it describes.
Get a weekly update like this for your product, free
Week of November 2, 2026
What shipped
- Dragonfly v2.1 shipped, and starting with this version the project moves from BUSL-1.1 to the Dragonfly Source-Available License (DSAL). Release
- CLIENT KILL now supports TYPE, USER, MAXAGE and SKIPME filters, so calls Sentinel sends such as CLIENT KILL TYPE pubsub no longer fail with a syntax error. Pull request #8756
- A CLIENT KILL that matches the caller now replies before closing its socket, and connections being migrated are skipped. Pull request #8752
- FT.AGGREGATE and FT.HYBRID now report shard errors the way FT.SEARCH does, and a clause on a NOINDEX field matches nothing. Pull request #8749
- FT.ALTER now rebuilds HNSW graphs instead of keeping graphs of existing vector attributes numbered under the old documents, and dropped graphs are retired. Pull request #8673
- EXPIREAT, PEXPIREAT and GETEX now clamp over-cap deadlines the same way EXPIRE and SET do, and GETEX returns the existing value for a key it could not re-expire. Pull request #8741
- INDEXMISSING, INDEXEMPTY and UNF flags are now stored, shown by FT.INFO and survive reload and full sync. Pull request #8720
- With no bind flags set, Dragonfly now listens on:: by default on hosts whose IPv6 sockets are dual-stack. Pull request #8682
- Cluster slot flushing now covers all active databases rather than only DB 0. Pull request #8669
- New metrics export snapshot and replica disconnect counters that were previously only visible in INFO or the logs. Pull request #8740
Why it matters
This week brings the v2.1 release, which moves the project from BUSL-1.1 to the Dragonfly Source-Available License and changes how teams can use it in production. On the server side, CLIENT KILL gained the filters Sentinel uses, search error reporting and HNSW graph handling on FT.ALTER were fixed, and expiry capping was unified so the same deadline rules apply across commands.
Changelog entry
- Release v2.1, moving from BUSL-1.1 to the Dragonfly Source-Available License (DSAL). Release
- CLIENT KILL supports TYPE, USER, MAXAGE and SKIPME filters. Pull request #8756
- CLIENT KILL replies before closing the calling connection and skips migrating connections. Pull request #8752
- FT.AGGREGATE and FT.HYBRID report shard errors; NOINDEX clauses match nothing. Pull request #8749
- FT.ALTER rebuilds HNSW graphs and retires dropped graphs. Pull request #8673
- EXPIREAT, PEXPIREAT and GETEX clamp over-cap deadlines; GETEX returns the existing value when re-expiry fails. Pull request #8741
- INDEXMISSING, INDEXEMPTY and UNF are stored, shown by FT.INFO and survive reload and full sync. Pull request #8720
- Listen on:: by default on dual-stack hosts when no bind flags are set. Pull request #8682
- Cluster slot flushing covers all active databases. Pull request #8669
- Export snapshot and replica disconnect counters as metrics. Pull request #8740
- Do not journal JSON.SET and CMS.MERGE when they are no-ops. Pull request #8695
- ACL checks read and write key permissions for commands like INCR and LPOP. Pull request #8721
Dragonfly v2.1 is out. Starting with this version the project moves from BUSL-1.1 to the Dragonfly Source-Available License. Also this week: CLIENT KILL TYPE/USER/MAXAGE/SKIPME filters, search errors reported in FT.AGGREGATE and FT.HYBRID, HNSW graphs rebuilt on FT.ALTER, and:: a
Dragonfly v2.1 shipped this week. From this version the project moves from BUSL-1.1 to the Dragonfly Source-Available License, a change in how teams can use it in production. The week also brought server fixes and additions: CLIENT KILL now accepts TYPE, USER, MAXAGE and SKIPME filters, including the calls Sentinel sends when switching master; FT.AGGREGATE and FT.HYBRID now report shard errors the way FT.SEARCH does; FT.ALTER rebuilds HNSW graphs and retires dropped ones; EXPIREAT, PEXPIREAT and GETEX clamp over-cap deadlines consistently; and with no bind flags Dragonfly listens on:: by default on dual-stack hosts.
Week of October 26, 2026
What shipped
- SAVE, BGSAVE and DFLY LOAD with a cloud snapshot URI no longer exit the server when cloud storage initialization fails at runtime. Pull request #8689
- In-progress SAVE and BGSAVE operations are cancelled when the server enters LOADING, including during full replication sync, and waiting commands get an UNBLOCKED error. Pull request #8505
- XINFO and JSON.DEBUG are now keyed commands, so EVAL scripts read them through the transaction instead of waiting on the shard running the script. Pull request #8648
- TIME now replies with an array of two bulk strings as documented, fixing strict typed clients that rejected the previous integer reply. Pull request #8712
- ACL file handling fails closed: a whitespace-only line no longer crashes the server, a failed load no longer leaves default open, and ACL SAVE writes atomically. Pull request #8681
- Search index definitions, aliases and synonym groups containing spaces or wide schemas survive reloads and full sync again. Pull request #8696
- A journaled FT.SYNUPDATE replayed during a replica full sync is no longer dropped, so replicas keep synonym groups across failover. Pull request #8671
- DFLYCLUSTER GETSLOTINFO batches its reply and collects per-shard stats in one pass, cutting CPU per call. Pull request #8715
- Search commands now resolve index aliases before running, covering searches issued against an alias. Pull request #8649
- Post-migration slot flushing is throttled with background-priority fibers and a CPU budget so foreground commands stay responsive. Pull request #8641
Why it matters
This week fixed several ways the server could lose data or die unexpectedly: a cloud storage hiccup during SAVE no longer exits the process, ACL files are loaded and saved safely, and search definitions with tricky names survive reloads. Replication and scripting also got more correct, with XINFO and JSON.DEBUG no longer able to hang scripts and synonym updates kept on replicas. Cluster slot queries and post-migration flushing are also cheaper for busy servers.
Changelog entry
- Don't exit when cloud snapshot storage init fails at runtime for SAVE, BGSAVE or DFLY LOAD. Pull request #8689
- Cancel in-progress SAVE and BGSAVE when loading starts; unblock waiting commands with an error. Pull request #8505
- Make XINFO and JSON.DEBUG keyed so scripts read them through the transaction. Pull request #8648
- Reply to TIME with two bulk strings as documented. Pull request #8712
- Fail closed on a broken aclfile, validate hashes, and save the ACL file atomically. Pull request #8681
- Keep search index definitions with spaces or wide schemas across reloads and full sync. Pull request #8696
- Keep FT.SYNUPDATE replayed during a replica full sync. Pull request #8671
- Make search commands alias aware and resolve aliases before searching. Pull request #8649
- Improve DFLYCLUSTER GETSLOTINFO performance by batching replies and collecting shard stats in one pass. Pull request #8715
- Add throttling to slot flushes after migration. Pull request #8641
- Expose
io_threadsandmax_connected_clients_per_threadmetrics. Pull request #8701 - Add an AOF manifest file with atomic durable writes. Pull request #8493
This week: cloud snapshot init failures no longer exit the server during SAVE or DFLY LOAD, ACL files fail closed and save atomically, TIME returns bulk strings, XINFO and JSON.DEBUG no longer hang scripts, and search index definitions survive reloads.
This week's changes focus on not losing data or availability by accident. A failure to initialize cloud snapshot storage during SAVE, BGSAVE or DFLY LOAD no longer calls exit, so a transient credential problem cannot kill a running instance. ACL file handling now fails closed and ACL SAVE writes atomically, so a concurrent load cannot read an empty file and wipe users. TIME replies with bulk strings as documented, fixing strict typed clients. XINFO and JSON.DEBUG are keyed commands, so scripts no longer hang waiting on their own shard. Search index definitions with spaces or wide schemas survive reloads and full sync, and a journaled FT.SYNUPDATE is kept on replicas. Cluster slot queries are cheaper, and post-migration slot flushing is throttled to keep foreground commands responsive.
Week of October 19, 2026
What shipped
- JSON indexes now accept several attributes on one JSON path, including the same path under different aliases. Pull request #8651
- SORTBY queries with LIMIT now order ties by key and rank documents missing a SORTABLE field last, fixing lost and duplicated documents across pages. Pull request #8664
- CLIENT and MEMORY admin subcommands now have their own ACL categories, and RM now respects key patterns. Pull request #8627
- CONFIG SET values and ACL SETUSER error texts no longer expose credentials in logs, SLOWLOG and INFO ERRORSTATS. Pull request #8659
- SADD no longer undercounts members added to the integer set before conversion to a string set. Pull request #8652
- Expired hash field values are now removed from search indices instead of continuing to match queries. Pull request #8657
- Stream commands other than XADD now reject * and -* as explicit stream IDs instead of acting on an indeterminate ID. Pull request #8634
- BLMOVE now concludes a single-shard blocking move in one hop when data is available. Pull request #8638
- Optimistic transactions in cache mode now register their key locks, preventing eviction of keys just written by multi-key commands. Pull request #8630
- AOF files are now replayed at startup, with a basic end-to-end test. Pull request #8484
Why it matters
This week fixes several query correctness gaps in search and stream handling that could return wrong results or leak credentials. It also tightens ACL enforcement and adds AOF replay at startup, which matters for recovery and access control.
Changelog entry
- Allow several attributes on one JSON path in search indexes. Pull request #8651
- Key the search schema by alias so one HASH field can be indexed by several attributes. Pull request #8604
- Order SORTBY ties by key and rank missing SORTABLE values last. Pull request #8664
- Give CLIENT and MEMORY admin subcommands their own ACL categories and check RM key patterns. Pull request #8627
- Hide CONFIG SET values and ACL SETUSER tokens in logs and errors. Pull request #8659
- Fix SADD undercounting after integer set conversion. Pull request #8652
- Remove expired hash field values from search indices. Pull request #8657
- Reject * and -* as explicit stream IDs outside XADD. Pull request #8634
- Conclude single-shard BLMOVE in one hop when data is available. Pull request #8638
- Register key locks of optimistic transactions in cache mode. Pull request #8630
- Replay AOF at startup with a basic end-to-end test. Pull request #8484
- Add slot stats across several databases. Pull request #8643
This week: search SORTBY paging fixed, multiple attributes per JSON path, ACL categories for CLIENT/MEMORY, CONFIG SET secrets hidden from logs, SADD counting fixed, and AOF replay at startup.
This week's changes to Dragonflydb include several correctness and security fixes. Search SORTBY with LIMIT now orders ties by key and ranks missing values last, so paging no longer loses or duplicates documents. JSON indexes accept several attributes on one JSON path, and expired hash fields are removed from search indices. On the security side, CLIENT and MEMORY admin subcommands have their own ACL categories, RM respects key patterns, and CONFIG SET values no longer appear in logs. SADD now counts members correctly across integer-to-string set conversion. Stream commands other than XADD reject * as an explicit ID. AOF files are replayed at startup with a basic end-to-end test.
Week of October 12, 2026
What shipped
- FT.ALIASADD, FT.ALIASUPDATE and FT.ALIASDEL are added so search indexes can be reached through stable alias names. Pull request #8556
- The event-driven RESP connection loop is now the default, with the older loop still available behind a flag. Pull request #8576
- PFMERGE now writes its destination only on its own shard, so DBSIZE, SCAN and replica key counts no longer pick up unreachable copies. Pull request #8602
- Lookups on an expired key now report a missing key instead of WRONGTYPE, so commands like GET on an expired hash behave like Valkey. Pull request #8581
- A replica flow that falls behind now yields in the stable-sync loop, so it cannot starve the admin connection or other fibers on the same thread. Pull request #8559
- Segment queue corruption in tiering is fixed and empty segments are released. Pull request #8528
- FT.ALTER now keeps synonym groups, so FT.SYNUPDATE results are no longer lost after altering an index. Pull request #8580
- BM25 scores no longer depend on the shard count, because the per-term stats and the posting lists being scored now describe the same data. Pull request #8542
- The idle timeout now applies to connections that never sent a byte, so pre-dialed client pool connections get reaped. Pull request #8368
- V2 pipeline counters for squashes, reply batches and idle waits are exported through the metrics endpoint. Pull request #8557
Why it matters
Several fixes this week target correctness in cluster, expiry and replication paths: PFMERGE copies, expiry racing a journal append, tracker invalidation on delete, and expired keys being reported as WRONGTYPE. The default RESP event loop changes how connections are handled by default, while search gains aliases. Operators also get fewer replication hangs on CI and a replica flow that can no longer starve its thread.
Changelog entry
- Search: add FT.ALIASADD, FT.ALIASUPDATE and FT.ALIASDEL with validation and checks Pull request #8556
- Facade: enable the RESP IoLoopV2 event loop by default; V1 remains behind enable_resp_io_loop_v2=false Pull request #8576
- Server: PFMERGE writes its destination only on its own shard, fixing inflated DBSIZE and duplicate SCAN keys Pull request #8602
- Db_slice: expire a key before the type check, so expired keys of other types read as missing Pull request #8581
- Replica: yield in the stable-sync flow loop so a lagging flow cannot starve its proactor thread Pull request #8559
- Tiering: fix segment queue corruption and release empty segments Pull request #8528
- Search: keep synonym groups across FT.ALTER Pull request #8580
- Search: make BM25 scores independent of the shard count Pull request #8542
- Server: apply the idle timeout to connections that never sent a byte Pull request #8368
- Metrics: export V2 pipeline counters for squashes, reply batches and idle waits Pull request #8557
- Qlist: add configurable
edge_depthto the list compression policy Pull request #8334 - Db_slice: journal and delete an expired key atomically Pull request #8555
This week: search aliases on FT.ALIASADD/UPDATE/DEL, the event-driven RESP loop is now default, PFMERGE writes only on its own shard, expired keys report missing instead of WRONGTYPE, and a lagging replica flow can no longer starve its thread.
This week in Dragonfly: search indexes can now be managed through aliases with FT.ALIASADD, FT.ALIASUPDATE and FT.ALIASDEL. The event-driven RESP connection loop became the default. PFMERGE now writes its destination only on its own shard, fixing inflated DBSIZE, duplicate SCAN results and key count differences between master and replica. Expired keys are reported as missing instead of WRONGTYPE, FT.ALTER keeps synonym groups, and BM25 scores no longer change with the shard count. A replica flow that falls behind now yields so other fibers on its thread keep running, tiering fixes segment queue corruption, and V2 pipeline counters are exported through metrics.
Week of October 5, 2026
What shipped
- Released v2.0.2, a patch release fixing a crash when DFLYMIGRATE is sent to a server not in cluster mode, and a crash on glob patterns with many wildcards in KEYS and SCAN-family MATCH patterns. Release
- Deeply nested search queries no longer overflow fiber stacks: evaluation, walking, profiling, rendering and destruction are now iterative, with depth bounded by query length at every entry point. Pull request #8492
- The macOS daily build works again with OpenSSL 4, which const-corrected the X509 accessors used when parsing TLS certificate info; the code now also builds against 1.1.1 and 3.x. Pull request #8509
- Global command rendezvous moved from JournalApplier to MultiShardExecution, with no functional changes. Pull request #8526
- List node ZSTD dictionary compression now honors
dont_compressand skips rejected nodes, so LSET with a large value no longer compresses a node being replaced. Pull request #8487 - The version check now reports anonymous deployment environment, role and finer cloud details so production can be told apart from dev and CI. Pull request #8498
- Search indices left unbuilt by a failed load or reload are now dropped instead of being reported as fully indexed and dereferenced by queries. Pull request #8500
- An AOF streamer was added with flags, per-shard journal consumer implementation, heartbeat sealing of small open segments, and a basic test; AOF is not allowed for replicas for now. Pull request #8470
- With tiering, SAVE and BGSAVE now wait for delayed entries taken over by writers before the final flush, so keys are no longer silently dropped from the snapshot file. Pull request #8457
- A crash from memory access after a key was deleted during HNSW index restoration was fixed, with a concurrent-deletion regression test. Pull request #8466
Why it matters
This week brought a patch release plus a run of fixes for crashes and data-loss paths: glob patterns in KEYS and SCAN-family commands, DFLYMIGRATE outside cluster mode, failed search index loads, HNSW restoration, and snapshots under tiering. Work also continued on the new AOF on-disk format and segment writer, and on making deeply nested search queries safe from stack overflow. Users on the patch release get the crash fixes, and the AOF and search refactors set up the next round of changes.
Changelog entry
- Release v2.0.2: fixes a crash when DFLYMIGRATE is sent to a server not in cluster mode and a crash on glob patterns with many * wildcards in KEYS and SCAN-family MATCH patterns. Release
- Fix(search): prevent stack overflow on deeply nested queries by replacing recursive evaluation, walking, profiling, rendering and destruction with iterative processing. Pull request #8492
- Fix(facade): build against OpenSSL 4 by using const-correct X509 accessors, keeping support for OpenSSL 1.1.1 and 3.x. Pull request #8509
- Refactor: move global command rendezvous from JournalApplier to MultiShardExecution; no functional changes. Pull request #8526
- Fix(qlist): skip
dont_compressand rejected nodes in ZSTD dictionary compression so LSET with a large value no longer compresses a node being replaced. Pull request #8487 - Report anonymous deployment environment, role and finer cloud details in the version check. Pull request #8498
- Fix(search): drop search indices left unbuilt by a failed load instead of reporting them as fully indexed. Pull request #8500
- Fix: prevent memory access after key deletion during HNSW index restoration, with a concurrent-deletion regression test. Pull request #8466
- Fix(snapshot): wait for delayed entries taken over by writers before the final flush so cluster and tiered snapshots no longer drop keys. Pull request #8457
- Feat(aof): add AOF streamer with flags and checks, a per-shard journal consumer, heartbeat sealing of small open segments, and a basic test. Pull request #8470
- Feat(aof): add durability handler for fsync, reduced durability state and error handling. Pull request #8464
- Feat(aof): add segment writer that asynchronously writes sealed blocks to the page cache and drains in-flight parallel writes. Pull request #8456
V2.0.2 is out: fixes a crash when DFLYMIGRATE hits a non-cluster server and a crash on glob patterns with many * wildcards in KEYS and SCAN-family MATCH. This week also made deeply nested search queries iterative, and added an AOF segment writer with a per-shard streamer.
This week Dragonfly shipped v2.0.2, a patch release that fixes a crash when DFLYMIGRATE is sent to a server not in cluster mode and a crash on glob patterns with many * wildcards in KEYS and SCAN/HSCAN/SSCAN/ZSCAN MATCH patterns. Alongside the release: deeply nested search queries are now processed iteratively so they no longer overflow fiber stacks, search indices left unbuilt by a failed load are dropped instead of being reported as fully indexed, and snapshots under tiering wait for delayed entries taken over by writers before the final flush. Work on the new AOF on-disk format, block builder and segment writer continued.
Week of September 28, 2026
What shipped
- Double-to-string formatting now uses dragonbox instead of google/double-conversion, benchmarking 1.88-3.36x faster than main. Pull request #8461
- OAHTable now automatically shrinks to reclaim spare capacity after removals when entry count falls below half the bucket count. Pull request #8454
- FT.INFO
percent_indexednow reports actual index build progress instead of fixed values during building. Pull request #8428 - Dragonfly now uses Valkey's hash-field-expiry RDB encoding as the default, adding protocol version 7 support. Pull request #8370
- MGET and memcache multi-key operations now borrow large values zero-copy under --get_zero_copy instead of copying them. Pull request #8420
- FT.SEARCH, FT.AGGREGATE and FT.HYBRID now support punctuation inside query words like @email:*example.com* and john.doe. Pull request #8419
- Unsupported RDB formats now terminate replication instead of retrying indefinitely, with explicit error reporting. Pull request #8421
- Fixed INFO persistence reporting
rdb_bgsave_in_progress:1 forever after BGSAVE by correcting member variable shadowing. Pull request #8459 - V2 pipeline squash now breaks after successful completion so bounded-pipeline clients can replenish requests without stalling. Pull request #8431
- Removed legacy RedisParser implementation now that separate RESP parsers are used throughout the codebase. Pull request #8465
Why it matters
This week brings significant performance improvements in string formatting and memory efficiency through automatic table shrinking and zero-copy operations. Search queries gain real progress reporting and punctuation support, while replication becomes more robust with proper error handling for unsupported formats. These changes address both user-facing features and internal stability for operators running production systems.
Changelog entry
- Performance: Double-to-string formatting 1.88-3.36x faster with dragonbox Pull request #8461
- Feature: Automatic OAHTable shrinking after removals Pull request #8454
- Feature: FT.INFO
percent_indexedshows real build progress Pull request #8428 - Feature: Valkey hash-field-expiry RDB encoding as default format Pull request #8370
- Performance: MGET zero-copy borrowing for large values Pull request #8420
- Feature: Punctuation support in FT.SEARCH/AGGREGATE/HYBRID queries Pull request #8419
- Fix: Unsupported RDB formats now terminal for replication Pull request #8421
- Fix:
rdb_bgsave_in_progresscleared properly after BGSAVE Pull request #8459 - Fix: V2 pipeline squash now breaks after successful completion Pull request #8431
- Fix: SORT BY/GET now reads offloaded strings instead of aborting Pull request #8436
- Refactor: Removed legacy RedisParser implementation Pull request #8465
- Chore: Updated third-party dependencies including Re-flex, croncpp, and SimSIMD Pull request #8460
New in Dragonfly: 1.88-3.36x faster double formatting with dragonbox, automatic OAHTable shrinking, real FT.INFO progress reporting, Valkey hash-expiry RDB support, zero-copy MGET, and punctuation in search queries.
This week's Dragonfly updates focus on performance and reliability. Double-to-string formatting is now 1.88-3.36x faster using dragonbox. OAHTable automatically shrinks after removals to reclaim capacity. Search queries gain real progress reporting and support punctuation like @email:*example.com*. MGET operations now borrow large values zero-copy. Replication becomes more robust by terminating unsupported RDB formats instead of retrying indefinitely. These improvements enhance both user experience and operational stability.
Week of September 21, 2026
What shipped
- CLUSTER SLOTS and SHARDS commands now batch their replies to reduce socket writes from thousands to one for large slot configurations. Pull request #8390
- Tiering now correctly accounts for large disk allocations above 1 MiB to track actual disk usage. Pull request #8377
- SCRIPT FLUSH no longer deadlocks by making the interpreter pool non-blocking with generation-based expiration. Pull request #8110
- FT.PROFILE now reports shard-side search errors instead of silently treating them as empty results. Pull request #8391
- Glob pattern matching in KEYS, SCAN, and other commands now iterates instead of recursing to prevent fiber stack overflow. Pull request #8350
- List compression is now controlled by a configurable policy flag instead of a single threshold. Pull request #8008
- Empty field names are now rejected in FT.CREATE, FT.ALTER, and FT.SEARCH to prevent crashes. Pull request #8385
- Set implementation reverted from StringSet back to OAHset. Pull request #8398
- Data heap destruction is now one-shot instead of making many individual destructor calls. Pull request #8336
- Replication tests now wait for replicas to catch up before comparing data sets. Pull request #8369
Why it matters
This week addresses performance bottlenecks in clustering and tiering, fixes critical issues in search and script management that could cause crashes or deadlocks, and improves test reliability. Memory and pattern matching improvements benefit workloads at scale.
Changelog entry
- Perf: batch reply for cluster slots/shards - reduces socket flushes from N*7 to 1 for 8k slots Pull request #8390
- Fix(tiering): Account for large disk allocations above 1 MiB Pull request #8377
- Fix: non-blocking interpreter pool so SCRIPT FLUSH can't deadlock Pull request #8110
- Fix(search): make FT.PROFILE report shard errors like FT.SEARCH Pull request #8391
- Fix(core): match globs iteratively to prevent fiber stack overflow Pull request #8350
- Feat(qlist): add --list_compress_policy for list compression configuration Pull request #8008
- Fix: reject empty field names and consume SETID parse errors Pull request #8385
- Fix(set): set OAHset implementation instead of StringSet Pull request #8398
- Perf: one-shot data heap destruct Pull request #8336
- Fuzz: make crash replay find the input that actually crashed the server Pull request #8396
This week: cluster command batching reduces socket writes, SCRIPT FLUSH deadlock fix, FT.PROFILE error reporting, glob pattern overflow prevention, and tiering disk accounting improvements.
Weekly update: CLUSTER SLOTS/SHARDS now batch replies for massive write reduction on large configurations. SCRIPT FLUSH deadlock eliminated through non-blocking interpreter pool. Search profiling now reports shard errors correctly. Pattern matching prevents fiber stack overflow. Tiering accurately tracks large disk allocations. Plus fixes to empty field validation and replication test reliability.
Week of September 14, 2026
What shipped
- Dragonfly v2.0.0 released, marking a major version milestone after three years with expanded Redis and Valkey compatibility. Release
- SCAN command family refactored to use shared ScanResult container with packed storage for better performance on small scan keys. Pull request #8352
- SCAN result collection optimized by packing key bytes into shared backing storage, with fallback to individual strings after 1 MiB. Pull request #8314
- Hash field expiration accuracy improved with second-resolution deadline helpers and rounded deadlines for better replay determinism. Pull request #8340
- Valkey TCL CI gate expanded from stream/pubsub to 248 additional passing tests including incr, string, bitfield, bitops, scan, dump, and geo. Pull request #8343
- Lua performance optimized by retrieving string data pointers and byte lengths in single API calls during redis.call argument preparation. Pull request #8335
- Expired keys now hidden from read commands even when client pause is active, improving consistency. Pull request #8323
- Commands parked by CLIENT PAUSE now properly released when connections close, preventing SIGTERM/SHUTDOWN hangs. Pull request #8296
- Hash and zset listpack validation improved on RDB load to surface errors and prevent NULL-dereference crashes. Pull request #8328
- Script load contention reduced by releasing borrowed Lua interpreters immediately after compilation before journaling. Pull request #8321
Why it matters
Version 2.0.0 marks significant maturity and production readiness. This week's changes focus on performance optimizations for SCAN operations, improved hash expiration accuracy, expanded Valkey test compatibility, and critical fixes for client pause handling and script loading that improve reliability at scale.
Changelog entry
- Release v2.0.0 with expanded Redis and Valkey compatibility Release
- Refactor SCAN command family to use shared ScanResult container with packed storage for small keys Pull request #8352
- Optimize SCAN result collection by packing key bytes into shared backing storage Pull request #8314
- Improve hash field expiration accuracy with second-resolution deadline helpers Pull request #8340
- Expand Valkey TCL CI gate to include 248 additional passing tests Pull request #8343
- Optimize Lua redis.call performance by retrieving string data in single API call Pull request #8335
- Hide expired keys from reads even when client pause is active Pull request #8323
- Fix CLIENT PAUSE hang by properly releasing parked commands on connection close Pull request #8296
- Validate hash and zset listpacks deeply on RDB load to prevent crashes Pull request #8328
- Reduce script load contention by releasing interpreters before journaling Pull request #8321
- Reject default user authentication without JWT token when JWT is enabled Pull request #8291
- Allow JWT authentication with TLS Pull request #8322
- Verify ACL categories match Valkey in CI Pull request #8311
- Fix ACL category mismatches and implicit category overwriting Pull request #8308
- Fix per-key permission checks for read-write commands Pull request #8249
- Reject invalid cluster node health values in config parser Pull request #8306
- Turn off journal after a bound when replica will not reconnect Pull request #8259
- Use RESPParser for Redis replication Pull request #8211
Dragonfly v2.0.0 is here. Three years in the making. Expanded Redis/Valkey compatibility, optimized SCAN performance, better hash expiration accuracy, and critical reliability fixes.
We're excited to announce Dragonfly v2.0.0—a major milestone representing three years of development toward production maturity. This release includes optimized SCAN command performance through shared result storage, improved hash field expiration accuracy for deterministic replay, expanded Valkey TCL test compatibility covering 248 additional tests, and critical reliability fixes including proper CLIENT PAUSE cleanup and script loading contention reduction.