Dragonfly

Developer Tools

An in-memory data store that speaks the Redis and Memcached protocols.

Latest v1.40.1 · by DragonflyDBWebsitedragonflydb/dragonfly

Release activity

Release activity — 10 releases across 10 days since Oct 14, 2025. Each cell is one day; darker means more releases that day. Nothing is recorded before Oct 14, 2025. Older weeks are hidden at this screen width.
MayJunJulAug
SundayNo releases on Apr 26, 2026No releases on May 3, 2026No releases on May 10, 2026No releases on May 17, 2026No releases on May 24, 2026No releases on May 31, 2026No releases on Jun 7, 2026No releases on Jun 14, 2026No releases on Jun 21, 2026No releases on Jun 28, 2026No releases on Jul 5, 2026No releases on Jul 12, 2026No releases on Jul 19, 2026No releases on Jul 26, 2026No releases on Aug 2, 2026No releases on Aug 9, 2026
MondayNo releases on Apr 27, 2026No releases on May 4, 2026No releases on May 11, 2026No releases on May 18, 2026No releases on May 25, 2026No releases on Jun 1, 2026No releases on Jun 8, 2026No releases on Jun 15, 2026No releases on Jun 22, 2026No releases on Jun 29, 2026No releases on Jul 6, 2026No releases on Jul 13, 2026No releases on Jul 20, 2026No releases on Jul 27, 2026No releases on Aug 3, 2026No releases on Aug 10, 2026
Tuesday1 release on Apr 28, 2026No releases on May 5, 2026No releases on May 12, 2026No releases on May 19, 2026No releases on May 26, 2026No releases on Jun 2, 20261 release on Jun 9, 2026No releases on Jun 16, 2026No releases on Jun 23, 2026No releases on Jun 30, 2026No releases on Jul 7, 2026No releases on Jul 14, 2026No releases on Jul 21, 2026No releases on Jul 28, 20261 release on Aug 4, 2026No releases on Aug 11, 2026
WednesdayNo releases on Apr 29, 2026No releases on May 6, 2026No releases on May 13, 2026No releases on May 20, 2026No releases on May 27, 2026No releases on Jun 3, 2026No releases on Jun 10, 2026No releases on Jun 17, 2026No releases on Jun 24, 2026No releases on Jul 1, 2026No releases on Jul 8, 2026No releases on Jul 15, 2026No releases on Jul 22, 2026No releases on Jul 29, 2026No releases on Aug 5, 2026
ThursdayNo releases on Apr 30, 2026No releases on May 7, 2026No releases on May 14, 2026No releases on May 21, 2026No releases on May 28, 2026No releases on Jun 4, 2026No releases on Jun 11, 2026No releases on Jun 18, 2026No releases on Jun 25, 2026No releases on Jul 2, 2026No releases on Jul 9, 2026No releases on Jul 16, 2026No releases on Jul 23, 2026No releases on Jul 30, 20261 release on Aug 6, 2026
FridayNo releases on May 1, 2026No releases on May 8, 2026No releases on May 15, 2026No releases on May 22, 2026No releases on May 29, 2026No releases on Jun 5, 2026No releases on Jun 12, 2026No releases on Jun 19, 2026No releases on Jun 26, 2026No releases on Jul 3, 2026No releases on Jul 10, 2026No releases on Jul 17, 2026No releases on Jul 24, 2026No releases on Jul 31, 2026No releases on Aug 7, 2026
SaturdayNo releases on May 2, 2026No releases on May 9, 2026No releases on May 16, 2026No releases on May 23, 2026No releases on May 30, 2026No releases on Jun 6, 2026No releases on Jun 13, 2026No releases on Jun 20, 2026No releases on Jun 27, 2026No releases on Jul 4, 2026No releases on Jul 11, 2026No releases on Jul 18, 2026No releases on Jul 25, 2026No releases on Aug 1, 2026No releases on Aug 8, 2026

10 releases since Oct 14, 2025

Changelog

v1.40.1

Fixed 2
  • Fixed connection-state handling in squashed pipelines so commands following AUTH, SELECT, HELLO, CLIENT, or RESET now observe the updated connection state instead of stale authentication, database, or RESP protocol state
  • Fixed compressed QList node memory accounting and defragmentation
This is a patch release.
What's Changed
  • Fixed connection-state handling in squashed pipelines. Commands following AUTH, SELECT, HELLO, CLIENT, or RESET now observe the updated connection state instead of stale authentication, database, or RESP protocol state (#8016).
  • Fixed compressed QList node memory accounting and defragmentation (#8011, #8014).

Full Changelog: v1.40.0...v1.40.1

View originalPermalink
How v1.40.1 went

v1.40.0

Added 14
  • Add Cuckoo Filter data type with CF.RESERVE, CF.ADD, CF.ADDNX, CF.EXISTS, CF.MEXISTS, CF.INSERT, CF.INSERTNX, CF.INFO, CF.COUNT, CF.DEL, and CF.COMPACT commands
  • Add RDB serialization support for Cuckoo filters, enabling DUMP/RESTORE and persistence
  • Add EPSILON parameter for HNSW-backed VECTOR_RANGE queries to control overscan and recall near the radius boundary
  • Add support for KNN query attribute block syntax with EF_RUNTIME and YIELD_DISTANCE_AS
  • Add RESET command to reset a connection to a fresh-connection baseline
  • Add Redis-compatible WAIT command to block until replicas acknowledge writes
Changed 5
  • Vector search now stores and computes vectors at native declared width instead of always widening to FLOAT32, reducing memory usage
  • INFO command now includes TLS certificate metadata (subject, issuer, validity dates) when TLS is enabled
  • Enable event-driven V2 IO loop for TLS connections
  • Enable tagged chunk serialization by default during snapshotting and replication
  • GET now returns large raw strings (≥16KB) via zero-copy borrowed view instead of copying
Fixed 2
  • Fix cascading replication correctness when an intermediate replica switches upstream masters under experimental cascaded partial sync
  • Fix crash where an older replica reconnecting to a promoted master could crash the master due to a stale partial-sync index
Security 1
  • Fix CVE-2025-32023 in hyperloglog.c by re-syncing with upstream Valkey

Dragonfly v1.40.0

This is one of our biggest releases yet—both in terms of feature quality, total contributions, and the highest number of external contributors in the last two years.

This release delivers major new functionality alongside a large body of correctness and stability fixes for tiered storage, replication, pub/sub, and the experimental V2 I/O loop.

We added a new data type: Cuckoo Filters (CF.RESERVE, CF.ADD/ADDNX, CF.EXISTS/MEXISTS, CF.INSERT/INSERTNX, CF.INFO/COUNT/DEL/COMPACT, and RDB persistence). This brings Dragonfly to parity with RedisBloom's probabilistic structures alongside expanded Bloom filter (BF.INFO) and HyperLogLog support.

Vector search gains native-width storage across all vector dtypes, EPSILON-tuned HNSW range queries, and EF_RUNTIME control. Meanwhile, a long list of fixes hardens tiered-storage interactions with strings, hashes, lists, bitops, and HLL commands, in addition to several replication-consistency fixes around lazy TTL expiry. Performance work includes lazy lock-table registration, zero-copy GET, and replica-side command batching.

  • New Cuckoo Filter data type with full command set and RDB support.
  • Vector search now stores/computes at native declared width, plus EPSILON and EF_RUNTIME tuning for HNSW.
  • Numerous tiered-storage and replication consistency fixes (HLL, hashes, lists, bitops, hash-field TTL expiry).
Highlights
  • Added a full Cuckoo Filter data type with RDB persistence, bringing RedisBloom parity for probabilistic structures (#7646, #7700).
  • Vector search now stores/computes vectors at native declared width instead of always widening to FLOAT32, reducing memory usage (#7849).
  • Re-synced hyperloglog.c with upstream Valkey, fixing CVE-2025-32023 and adding AVX2/NEON kernels [up to ~29x speedup on dense HLL merges] (#7961).
Commands
  • INFO now includes TLS certificate metadata (subject, issuer, validity dates) when TLS is enabled (#7844).
  • SAVE and BGSAVE now support a HELP subcommand (#7865).
  • JSON.STRAPPEND now supports an optional path argument, defaulting to root (#7868).
  • Implemented the RESET command, resetting a connection to a fresh-connection baseline (#7760).
  • Added Redis-compatible WAIT command, blocking until replicas acknowledge writes (#7454).
  • Added HGETEX and HPEXPIRETIME hash commands (#7717).
  • Added BF.INFO for Bloom filter metadata (#7761).
  • Added BM25STD.NORM and BM25STD.TANH scorers for FT.SEARCH/AGGREGATE/HYBRID (#7692).
Vector Search
  • Vector search (FLAT and HNSW) now stores and computes distances at native declared width (INT8, UINT8, FLOAT16, BFLOAT16, FLOAT32, FLOAT64) (#7849).
  • Added EPSILON parameter for HNSW-backed VECTOR_RANGE queries to control overscan/recall near the radius boundary (#7718).
  • Added support for KNN query attribute block syntax (=>{$EF_RUNTIME: ...; $YIELD_DISTANCE_AS: ...}) (#7708).
  • Fixed filtered KNN vector search to serialize only actual winners instead of every pre-filter match, cutting CPU/memory overhead (#7670).
Cuckoo Filter
  • Added CF.INSERT and CF.INSERTNX for bulk insertion, with optional CAPACITY and NOCREATE (#7719).
  • Added compaction: CF.DEL auto-compacts past 10% deletions, plus a manual CF.COMPACT command (#7702).
  • Added CF.EXISTS and CF.MEXISTS for single/multi-item membership checks (#7682).
  • Added CF.ADD and CF.ADDNX, auto-creating filters with a default capacity of 1024 (#7681).
Probabilistic Data Structures
  • Added RDB serialization support for Cuckoo filters, enabling DUMP/RESTORE and persistence (#7700).
  • Added CF.INFO, CF.COUNT, and CF.DEL for filter metadata, occurrence counts, and item removal (#7691).
  • Added the base Cuckoo Filter data type via CF.RESERVE, with a new CUCKOO_FILTER ACL category (#7646).
Performance
  • Extended parse-in-proactor pipelining optimization to more fiber park spots (shard hops, suspended replies on tiered I/O) (#7916).
  • Added snapshot_egress_limit_bytes to throttle per-shard socket egress during RDB/snapshot saves (#7774).
  • Reworked open-addressing hash container (OAHPair/OAHEntry) with compact variable-width size encoding, reducing fragmentation (#7853).
  • Enabled event-driven V2 IO loop for TLS connections (#7890).
  • Lists loaded from RDB/replication now benefit from ZSTD dictionary compression on load, not just push (#7734).
  • Replica-side Redis replication stream processing now batches commands via DispatchSquashedBatch (#7501).
  • Added write_connection_throttling_sleep_usec to throttle pipelined write batches, plus new batch I/O metrics (#7750).
  • [Total sampled CPU cycles dropped from 64.34B to 59.31B (-7.8%)] Prefetches command contexts before executing squashed pipelined commands (#7796).
  • Optimistic single-shard inline transactions now skip lock-table registration in the common case (#7788).
  • [+9.2% ops/s at pipeline=1, +5.0% at pipeline=10] V2 connection I/O loop drains pending socket data directly from RegisterOnRecv while suspended (#7608).
  • GET now returns large raw strings (≥16KB) via zero-copy borrowed view instead of copying (#7426).
  • Added connection_memory_bytes Prometheus metric tracking active client connection memory (#7550).
  • Wired pipeline squashing into the V2 event-driven dispatch loop via --enable_pipeline_squashing_v2 (#7631).
Replication
  • Fixed cascading replication correctness when an intermediate replica switches upstream masters under experimental cascaded partial sync (#7913).
  • Enabled tagged chunk serialization by default during snapshotting and replication (#7823).
  • RDB loader no longer aborts on EOF with a partially received tagged chunk; now logs a warning and continues (#7660).
  • Fixed a crash where an older replica reconnecting to a promoted master could crash the master due to a stale partial-sync index (#7491).
  • Added a Prometheus metric for replication backlog buffer memory usage (#7644).
Search
  • Applied TEXT field schema weights and query-time $weight attributes to BM25/TF-IDF scoring (#7752).
  • Added parsing support for query-time =>{$WEIGHT} attributes on terms, tag filters, and vector range queries (#7749).
  • Added EF_RUNTIME support for HNSW vector search, actually applying it instead of just parsing it (#7696).
  • Fixed FT.SEARCH quoted TAG values not matching stored values containing backslashes or quotes (#7907).
  • Fixed a race in RestoreStreamer where concurrent Cancel()/Start() could double-unregister a change listener (#7707).
  • Fixed KNN vector search score aliases to properly generate/return implicit score fields (#7604).
  • Fixed FT.SEARCH to return VECTOR fields as raw stored binary buffer instead of textual representation for HASH-stored fields (#7586).
Cluster
  • DFLYCLUSTER SLOT-MIGRATION-STATUS now includes covered slot ranges in its reply (#7911).
  • Fixed a race between Finish() teardown and SyncFb retry loop in slot migration (#7869).
  • Fixed OOM during incoming slot migration not propagating rollback deletion to the target's replica (#7533).
  • Added predefined Helm chart values for enabling Redis-compatible cluster mode (#7123).
Security
  • Fixed ACL DRYRUN gaps: multi-word commands, pub/sub channel checks, and content-dependent key positions (#7919).
  • Fixed ACL DRYRUN to support command arguments for accurate key-pattern permission validation (#7871).
Cloud & Storage
  • Fixed Azure snapshot storage to accept standard Azure Blob HTTPS URLs instead of custom az:// scheme (#7878).
  • Added list_tiering_prefetch_depth to asynchronously prefetch neighboring offloaded list nodes (#7834).
  • Made tiered storage initial backing file size configurable via tiering_disk_storage_initial_size, with 5%-of-capacity growth policy (#7715).
  • Tiered storage now skips offloading keys with remaining TTL below a configurable minimum (tiered_min_ttl_to_offload_ms) (#7624).
Bug fixes
  • Fixed per-slot memory_bytes accounting in cluster mode to correctly track resident RAM across tiered storage operations (#7966).
  • Fixed a read-buffer capacity accounting bug causing client_read_buffer_bytes to leak or double-count (#7951).
  • Fixed two crash/corruption bugs in cluster mode slot operations (FlushSlots and GetSlotStats) and enforced strict db0-only usage (#7960).
  • Fixed blocked XREAD/XREADGROUP being incorrectly woken by lower XADD ids, and a null-pointer crash on plain XREAD (#7959).
  • Fixed blocking XREAD/XREADGROUP on emptied streams returning immediately instead of waiting (#7958).
  • Fixed memory usage reporting for small string keys with TTL to report actual mimalloc block size (#7947).
  • Fixed replication divergence with HEXPIRE, HGETEX, HSETEX, and FIELDEXPIRE on lazily expired fields (#7948).
  • Fixed a crash when Lua scripts call GET on large string values via borrowed replies (#7934).
  • Fixed a replication bug where SHRINK's bucket compaction could leave a deleted key alive forever on a replica (#7938).
  • Fixed a cross-thread data race in command squashing accessing a shared reply builder concurrently (#7927).
  • Fixed EPERM handling in the io_uring support check, falling back to epoll (#7810).
  • Fixed slow Pub/Sub subscribers not being evicted based on per-connection queued-data threshold (#7917).
  • Fixed a regression where UNSUBSCRIBE could jump ahead of queued pub/sub messages (#7909).
  • Fixed the V2 dispatch queue loop not setting async_op_start_cycle_, hiding timed-out async operations (#7902).
  • Dragonfly now force-closes blocked Pub/Sub subscribers exceeding a configurable soft memory limit (#7889).
  • Fixed a bug where a dropped checkpoint message leaked the DispatchTracker counter, hanging REPLTAKEOVER/CLIENT PAUSE/shutdown (#7862).
  • Fixed a race condition in REPLTAKEOVER where master-check and replica pointer check weren't atomic (#7870).
  • Fixed a use-after-free bug garbling long strings (stream IDs, sortkeys, scan cursors) sent by reference (#7874).
  • Fixed a bug where a blocked XREAD/XREADGROUP with COUNT ignored the COUNT limit on wake-up (#7872).
  • RDB loading now skips keys with unsupported module types instead of aborting the whole load (#7912).
  • Fixed a bug causing Dragonfly to SIGABRT on invalid startup flags instead of exiting cleanly (#7843).
  • Fixed crashes/incorrect behavior when commands accessed offloaded string values (DEBUG OBJECT, INCRBYFLOAT, memcached APPEND/PREPEND, JSON.GET) (#7836).
  • Fixed a race where heartbeat expiry/eviction could run while an optimistic transaction was suspended (#7826).
  • Fixed crashes in HLL commands when values were offloaded to tiered storage, plus a pipeline-squashing race corrupting results (#7820).
  • Fixed a race in the V2 (io_uring) connection loop allowing CLIENT PAUSE/takeover/migration/shutdown to proceed early (#7805).
  • Fixed bitops commands (GETBIT, SETBIT, BITCOUNT, BITPOS, BITOP, BITFIELD) crashing on tiered string values (#7806).
  • Fixed a bug where stopping MONITOR mode didn't decrement the subscriptions counter (#7777).
  • Fixed the V2 IoLoopV2 path not tracking in-flight command dispatches, breaking CLIENT PAUSE/takeover/migration (#7764).
  • Fixed buffered replies remaining undelivered when a subsequent pipelined command blocked in the V2 path (#7733).
  • Fixed missing bookkeeping (command counters, idle timestamp) in the V2 connection batch dispatch path (#7726).
  • Fixed a bug where a bare GETEX (no expiry options) was incorrectly replicated (#7701).
  • Fixed a stats bug where io_uring multishot recv failed to update read counters (#7680).
  • Fixed dragonfly_commands_processed_total always reporting 0 (#7667).
  • Fixed a crash in Lua scripting when redis.call() received a non-string/number command name (#7655).
  • Fixed a QList bug where inserting before the first element of a full head node misplaced the element (#7640).
  • Fixed tiered list bugs: node deletion promoting offloaded nodes without materializing (#7638), stale entry pointers after restore (#7636).
  • Fixed a bug where MOVEing a key between databases left stale search index and memory-usage entries (#7637).
  • Fixed a replication bug where an older replica reconnecting to a promoted master could crash it (#7491).
  • Fixed a crash when admin control commands appeared inside a squashed pipeline (#7621).
  • Fixed a parsing bug where malformed RESP was silently treated as needing more input instead of a protocol error (#7615).
  • Restored the experimental_io_loop_v2 flag after accidental removal (#7607).
  • Fixed keyspace-notification delivery running inside a fiber-atomic section during heartbeat expiry (#7540).
  • Re-enabled fiber yielding during long-running container iteration commands (#7449).
  • Fixed BITFIELD, BITOP, and SETBIT accepting out-of-range bit offsets, risking overflow/crashes (#7513).
Huge thanks to all the contributors! ❤️
New Contributors
What's Changed

Full Changelog: https://github.com/dragonflydb/dragonfly/compare/v1.39.0...v1.40.0

View originalPermalink
How v1.40.0 went

v1.39.0

Added 13
  • Add FT.HYBRID command combining full-text and vector similarity search with LINEAR and RRF score fusion strategies, HNSW KNN and range-based vector queries, YIELD_SCORE_AS aliasing, LOAD projection, and FT.PROFILE support
  • Add exact phrase queries with syntax "hello world" and approximate phrase matching with slop "..."~N backed by per-document token positions in compressed posting lists
  • Add BM25STD (Okapi BM25) relevance scoring engine with per-field TF and document-length tracking
  • Add TFIDF and TFIDF.DOCNORM scorer options for FT.SEARCH, FT.PROFILE, and FT.AGGREGATE
  • Add WITHSCORES and SCORER parameters to FT.SEARCH
  • Add ADDSCORES parameter to FT.AGGREGATE to inject a __score field for downstream GROUPBY/SORTBY/REDUCE on relevance
Changed 5
  • PubSub, Monitor, and Invalidation replies are now batched per wakeup instead of one sendmsg per message, delivering up to +12% RPS and 24–70% fewer syscalls
  • INFO REPLICATION and replica memory stats are now served lock-free via per-proactor thread-local snapshots
  • Replace global RCU-based ChannelStore with ShardedHashMap using 16 independent shard locks for pub/sub
  • Tiered hashes are now mutable
  • Cluster config validation now rejects invalid migration configurations at parse time including wrong target masters, duplicate targets, empty or out-of-range slot sets, and overlapping migration ranges
Fixed 2
  • Fix NotifyWatchQueue to exit in O(1) when a watched key is absent instead of O(N) over all waiters
  • Fix zombie-key cleanup across SORT, ZUNIONSTORE, ZINTERSTORE, SHRINK, and hash TTL commands to prevent empty containers in keyspace
Security 1
  • Apply multiple Lua sandbox hardening patches and RESP injection prevention

Dragonfly v1.39.0

This release delivers a significant leap in full-text search capability — FT.HYBRID fuses vector similarity with text queries, exact phrase matching with slop arrives, Porter stemming is on by default for TEXT fields, and BM25STD/TFIDF scoring with WITHSCORES support rounds out a deeply improved search engine. Performance improves across the board: PubSub reply batching cuts syscalls by 24–70% and raises throughput up to +12% RPS, INFO REPLICATION becomes fully lock-free, and a new ShardedHashMap replaces the global RCU ChannelStore for pub/sub. Security is tightened with multiple Lua sandbox hardening patches, RESP injection prevention, and PII-safe error logging. Tiered hashes are now mutable. A significant sweep of zombie-key cleanup fixes closes a class of bugs where lazy field expiry across SORT, ZUNIONSTORE, ZINTERSTORE, SHRINK, and hash TTL commands left empty containers in the keyspace.

Highlights
  • Added FT.HYBRID combining full-text and vector similarity search with LINEAR and RRF score fusion strategies, capping a major release cycle of search improvements (#7420)
  • PubSub, Monitor, and Invalidation replies are now batched per wakeup, delivering up to +12% RPS and 24–70% fewer syscalls at pipeline depths 1–500 (#7479)
  • Tagged chunk serialization splits large objects across snapshot and replication boundaries so they can be reassembled correctly even with interleaved journal entries (#7416, #7070)
Search
  • Adds FT.HYBRID combining full-text and VSIM search via LINEAR (ALPHA/BETA weighted sum of normalized scores) and RRF (Reciprocal Rank Fusion) strategies, with HNSW KNN and range-based vector queries, YIELD_SCORE_AS aliasing, LOAD projection, and FT.PROFILE support (#7420)
  • Adds exact phrase queries ("hello world") and approximate phrase matching with slop ("..."~N), backed by per-document token positions stored in compressed posting lists; BM25 scoring updated for phrase semantics (#7319)
  • TEXT fields now apply Porter stemming by default via the vendored Snowball/libstemmer library; per-field NOSTEM, index-level LANGUAGE (default english), and per-document LANGUAGE_FIELD are all supported; FT.INFO surfaces the new flags (#7295)
  • Adds BM25STD (Okapi BM25) relevance scoring engine with per-field TF and document-length tracking for accurate normalization; results can be ranked when a scorer is activated (#7101)
  • Adds TFIDF (TF × ln(N/n)) and TFIDF.DOCNORM (additionally normalized by field length) as new scorer options for FT.SEARCH, FT.PROFILE, and FT.AGGREGATE; scorer dispatch refactored to a function-pointer table (#7200)
  • FT.SEARCH now supports WITHSCORES and SCORER parameters; FT.AGGREGATE gains ADDSCORES to inject a __score field enabling downstream GROUPBY/SORTBY/REDUCE on relevance (#7181)
  • HNSW vector index memory is now tracked in the search_used memory class and reported in dragonfly_memory_used_bytes via an atomic capacity-based footprint counter (#7205)
Performance
  • PubSub, Monitor, and Invalidation control-path replies are now accumulated in the send buffer and flushed together per wakeup rather than one sendmsg per message; single-message wakeups still flush immediately [+3% RPS at pipeline=1, +12% at pipeline=10, −24% to −70% syscalls at pipeline=1–500] (#7479)
  • INFO REPLICATION and replica memory stats are now served lock-free via per-proactor thread-local snapshots updated on every mutation, eliminating global mutex and per-replica shared-lock fan-out (#7348)
  • Replaced the global RCU-based ChannelStore with a ShardedHashMap (16 independent shard locks), removing the pool-wide broadcast on every subscribe/unsubscribe (#7174)
  • NotifyWatchQueue exits in O(1) when a watched key is absent (previously O(N) over all waiters), directly benefiting BLPOP, BZPOPMIN, and XREAD workloads (#7225)
  • Long-running container iteration commands (LRANGE, SMEMBERS, ZRANGE, HGETALL, etc.) now yield the shard fiber periodically; configurable via --container_iteration_yield_interval_usec (default 500 µs, 0 to disable) (#7391)
  • Integrates OAHSet as an alternative in-memory set backend selectable via --use_oah_set; threaded through RDB save/load, async deletion, defragmentation, and SHRINK (#7246)
  • Adds foundational zero-copy GET infrastructure to CompactObj and LargeString: TryBorrow() returns an encoded view with Copy-on-Write semantics; a thread-local pin registry defers buffer deallocation until all readers finish (#7412)
  • Connections that occasionally receive large commands now trim parse buffers exceeding 256 KiB at more than 2× actual utilization, preventing permanent oversized memory holds (#7378)
Replication
  • Adds serialization_tagged_chunks flag enabling the RDB serializer to split large entries into tagged chunks with envelope IDs; compression is applied per-blob; a related list-decoding crash during chunked load is also fixed (#7416)
  • Implements tagged chunk loading in the RDB loader with per-stream continuation state, supporting interleaved chunks from different objects and cross-database-boundary reassembly (#7070)
  • Four new Prometheus metrics are now emitted on replica instances at /metrics: dragonfly_master_link_status, dragonfly_master_last_io_seconds_ago, dragonfly_sync_in_progress, and dragonfly_slave_repl_offset (#7069)
Cluster
  • Adds --cluster_coordinator_connect_timeout_ms and --cluster_coordinator_response_timeout_ms flags to control coordinator-to-shard timeouts (previously hard-coded at 3000 ms) (#7221)
  • Cluster config validation now rejects invalid migration configurations at parse time: wrong target masters, duplicate targets, empty or out-of-range slot sets, and overlapping migration ranges (#7210)
Commands
  • CLIENT LIST now supports TYPE <normal|master|replica|slave|pubsub> and ID <id> [id …] filter arguments; outbound replication links are surfaced as TYPE master entries; CLIENT KILL ID on a master-link ID returns a descriptive error directing users to REPLICAOF NO ONE (#7377)
  • DEBUG TRAFFIC now supports per-listener recording (LISTENER <main|memcache|admin>), full Memcache protocol capture and replay (SET/GET/CAS/INCR/GAT/etc. with flags, expiry, and CAS tokens), and a v3 file format; v2 files remain readable (#7192)
  • DEBUG TRAFFIC START <path> REPLICA records the replication stream received by a replica from its master; fails with a clear error on standalone/master instances (#7217)
  • BF.SCANDUMP iteratively exports a Scalable Bloom Filter in chunks of up to 16 MiB, returning (cursor, data) pairs until cursor=0 signals end-of-stream (#7092)
  • BF.LOADCHUNK reconstructs an SBF from chunks produced by BF.SCANDUMP, completing the SCANDUMP/LOADCHUNK round-trip; guards prevent other BF commands from operating on a partially-loaded filter (#7169)
  • BGSAVE now accepts the optional SCHEDULE subcommand (case-insensitive) for Redis client compatibility; concurrent saves are still rejected rather than queued (#7286)
  • dfly_bench gains --json_out_file to write a memtier_benchmark-compatible latency JSON report including per-operation aggregate stats (count, ops/sec, average/min/max, p50/p99/p99.9) and a per-second time-series (#7269)
Security
  • The Lua load() built-in is now wrapped to enforce text-only mode ("t"), closing a sandbox escape vector where a malicious script could supply binary Lua bytecode to bypass restrictions (#7376)
  • Lua sandbox hardened: rawset, setmetatable, and getmetatable are overridden to block access to _G and all global library tables; guard metatables are attached to prevent replacement or corruption across script executions (#7370)
  • Error logs from failed commands no longer include user-supplied PII: arguments are truncated at 128 bytes with a byte-count suffix, at most 31 args are logged, EVAL KEYS/ARGV are omitted, and AUTH/ACL subcommands are fully redacted (#7338)
  • INFO ACL section added, exposing aggregate registry metrics (acl_num_users, password/glob counts, estimated acl_total_bytes) maintained incrementally without holding the registry write lock (#7149)
Cloud & Storage
  • S3 snapshot storage is now available in all builds using helio's native S3 client by default; the AWS SDK backend remains available via WITH_AWS + --s3_use_helio_client=false; builds without WITH_AWS no longer exit on s3:// paths (#7180)
  • Azure Blob Storage snapshot backend fully implemented: az:// URIs are correctly routed, OpenWriteFile/OpenReadFile use the cloud::azure API, and cursor-based pagination fixes truncation for large buckets (#7131)
  • Hash write commands (HSET, HDEL) now operate on hashes offloaded to tiered (disk-backed) storage: the serialized listpack is read from disk, mutated in-place, and re-stashed with I/O backpressure (#6085)
  • S3 endpoint override (e.g. for MinIO) is now passed directly to AwsCredsProvider instead of setting AWS_S3_ENDPOINT in the process environment, eliminating side effects for other processes (#7408)
Bug Fixes

Replication & Persistence

  • Fixed slave_repl_offset reporting zero in INFO REPLICATION when replicating from a Redis/Valkey master; offset is now correctly populated from repl_offs_ (#7517)
  • Fixed a TOCTOU race where a DflyConn_ fiber could violate the serializer's fiber-identity check during BGSAVE while Lua EVAL scripts ran concurrently (#7499)
  • Fixed single-shard batch scheduling (ScheduleBatchInShard) allowing a journal DEL entry to execute before the RDB loader finished creating the key on a shard (#7507)
  • Fixed SBF (Scalable Bloom Filter) serialization mismatch where SaveString encoding was read back as raw bytes, crashing Dragonfly in Renamer::FinalizeRename on COPY/DUMP (#7475)
  • Fixed data loaded via DFLY LOAD not propagating to replicas; the journal ring buffer is now cleared and reconnecting replicas are forced into full sync (#6740)
  • Fixed slot MOVED redirections becoming corrupted after replica takeover due to REPLCONF CLIENT-ID sending the replica's internal ID instead of its cluster node ID (#7263)
  • Fixed a race in cluster slot migration restart where StartNewSlotMigrations was called before stale slot data was flushed, causing incoming DFLYMIGRATE FLOW writes to be wiped (#7333)
  • Fixed a SIGSEGV during HNSW index replication where per-shard restoration raced with new HSET operations on still-restoring shards; a three-state lifecycle (kProhibit → kRestoring → kBuilding) now defers all graph mutations until all shards complete (#7126)

Security & Lua

  • Fixed a RESP protocol injection vulnerability where redis.error_reply() / redis.status_reply() strings containing \r\n could inject arbitrary frames into the response stream (#7332)
  • Fixed dragonfly.randstr() accepting unbounded arguments; input is now validated for count (1–32768), size (1–16 MiB), and type (#7368)
  • Fixed EVAL/EVALSHA crashing with a CHECK abort on negative or non-numeric numkeys arguments (e.g. "-0") instead of returning an error reply (#7203)

Search

  • Fixed full-text search scoring (BM25, TF-IDF, TFIDF.DOCNORM) using per-shard document stats instead of global aggregates, causing non-deterministic top-K rankings on multi-shard deployments; a two-phase stats-collection pass now precedes the search (#7250)
  • Fixed TEXT field tokenization not honoring backslash escapes (e.g. \., \-, \:) symmetrically at index time and query time, causing escaped-punctuation queries to fail to match (#7438)
  • Fixed a crash during SAVE when FT.SEARCH lazy field expiry left behind an empty zombie hash key; StringMapAccessor's destructor now deletes the key if the hash is empty after access (#7166)

Commands & Data Structures

  • RESTORE now performs deep (entry-by-entry) integrity validation on listpack, intset, quicklist, and stream payloads, preventing crafted payloads with malformed interior entries from causing OOB reads or crashes (#7502)
  • Fixed DenseSet::SetExpiryTime not setting expiration_used_, causing RandomPairsUnique to skip expiry filtering and return already-expired keys (#7392)
  • Fixed two use-after-free bugs in DenseSet expiry chain walks (ExpireIfNeededInternal, Find2) where deleting a node left node/curr dangling for subsequent iterations (#7393)
  • Fixed single-field hashes incorrectly converting to dense_set encoding when the value exceeded max_map_field_len; listpack encoding is now preserved for single-field hashes regardless of value size (#7257)
  • Fixed an out-of-bounds read in BITCOUNT with BIT index mode when the end index falls exactly on a byte boundary, and incorrect handling of both-negative inverted ranges on short strings (#7190)
  • Fixed per-type memory accounting underflow when AutoUpdater::Run() processed a value whose object type changed (e.g., SORT STORE overwriting a SET with a LIST) (#7142)
  • Fixed XADD computing an incorrect memory diff when RecordJournal preempted and triggered evictions before the stream size update; UpdateStreamSize is now called before RecordJournal (#7235)
  • Fixed MEMORY DEFRAGMENT silently ignoring parse errors for the threshold float argument and proceeding with defaults (#7346)
  • Fixed MULTI/EXEC ghost connections (addr=0.0.0.0, phase=scheduled) permanently stalling when a socket RST prevented CancelBlocking() from being reached (#7273)
  • Fixed a FIN_WAIT_2/CLOSE_WAIT socket leak where connections blocked on BLPOP and similar commands did not observe EOF when the client closed its socket (#7224)
  • Fixed a crash during BGSAVE when a lazily-expired hash field caused an empty container mid-snapshot; DFATAL downgraded to ERROR so the entry is safely skipped (#7452)
  • Fixed a crash in DEBUG OBJHIST/UNIQ-STRS from lazy expiry triggered in an unexpected fiber context, and a second bug where the wrong DB index was used when deleting the resulting zombie key (#7241)
  • Fixed a bad-input parse error in the RESP server parser logging at ERROR level, which allowed malformed/adversarial clients to flood the error log; downgraded to rate-limited WARNING (#7352)

Zombie Key / Empty Container Cleanup — Fixed a widespread class of bugs where lazy field or member expiry left empty containers as zombie keys, causing DFATAL crashes in subsequent SAVE or incorrect command behavior:

  • Empty hash not deleted after: FIELDTTL (#7137), FIELDEXPIRE (#7158), HTTL/HPTTL (#7159), DEBUG OBJHIST/UNIQ-STRS (#7165)
  • Empty set not deleted after: SHRINK compaction (#7160), SORT (#7161), SORT BY pattern (#7162), ZUNIONSTORE (#7163), ZINTERSTORE (#7164)
  • Lazy expiry disabled during cluster migration serialization to prevent mid-iteration deletions that caused DFATAL on empty-container saves (#7167)

What's Changed
Huge thanks to all the contributors! ❤️
New Contributors

Full Changelog: https://github.com/dragonflydb/dragonfly/compare/v1.38.0...v1.39.0

View originalPermalink
How v1.39.0 went

v1.38.1

Fixed 2
  • Re-use journal executor in server
  • Avoid O(n) scans in NotifyWatchQueue
This is a patch release
What's Changed
  • fix(server): Re-use journal executor (#7201)
  • test(connection): add a fix for FIN_WAIT_2 leak bug with BLPOP (#7224)
  • fix: avoid O(n) scans in NotifyWatchQueue (#7225)

Full Changelog: https://github.com/dragonflydb/dragonfly/compare/v1.38.0...v1.38.1

View originalPermalink
How v1.38.1 went

v1.38.0

Added 7
  • Top-K command family (TOPK.*) with RedisBloom compatibility and RDB persistence
  • Count-Min Sketch family (CMS.*) with INITBYDIM, INITBYPROB, INCRBY, QUERY, MERGE, and INFO commands with RDB persistence
  • HTTL command to return remaining TTL for specific hash fields
  • VECTOR_RANGE search for radius-based vector similarity queries in FT.SEARCH and FT.AGGREGATE with optional YIELD_DISTANCE_AS
  • FT.AGGREGATE support for FILTER, APPLY, DIALECT, and KNN steps in the aggregation pipeline
  • New Prometheus metrics including pipeline latency histogram, TLS handshake counter, stream access patterns, and pipeline blocking counter
  • AWS credential chain support for EKS Pod Identity and ECS task roles for S3
Changed 6
  • Reduce memory usage by ~26% for TTL workloads by eliminating expire table and embedding expiry in CompactKey via SDS_TTL_TAG
  • KNN prefilter now falls back to brute-force scan when prefilter result set is small
  • Replica expired-key deletion enabled by default with --replica_delete_expired flag allowing replicas to proactively delete expired keys on reads
  • Early TLS filter and TCP_DEFER_ACCEPT drops zombie connections at OS level before allocating fiber and OpenSSL state
  • Memcached io_loop_v2 enabled by default for async I/O with deferred replies
  • Incremental SBF replication flushes Scalable Bloom Filter chunks incrementally to bound peak memory
Fixed 2
  • Fix HNSW index creation failure, logs, and drop
  • Validate stream command arguments to prevent crashes

Dragonfly v1.38.0

This release is a major one with lots of significant improvements and stability fixes. It may behave differently due to changes in its core data structures.
We worked hard to avoid any regressions so please let us know if you observe degradation around item expiry behavior, replication or backups.

Important stability fixes and changes:

Top-K command family (TOPK.*): RedisBloom-compatible heavy-hitter sketch with RDB persistence. (#6920, #6931, #6932, #6950)

Count-Min Sketch family (CMS.*): Full CMS with INITBYDIM, INITBYPROB, INCRBY, QUERY, MERGE, INFO. RDB persistence. (#6867, #6888, #6896, #6897)

~26% memory reduction for TTL workloads: Expire table eliminated, expiry embedded in CompactKey via SDS_TTL_TAG. 10M keys: 900 MB -> 665 MB. (#6923, #6925, #6933)

HTTL command: Returns remaining TTL for specific hash fields. (#6879)

VECTOR_RANGE search: Radius-based vector similarity queries in FT.SEARCH and FT.AGGREGATE for both FLAT and HNSW indexes, with optional YIELD_DISTANCE_AS. (#6880, #6898, #6938)

FT.AGGREGATE: FILTER, APPLY, DIALECT, KNN: Full expression-based filtering, computed fields, dialect selection, and KNN steps in the aggregation pipeline. (#6968, #6982, #7066)

Smarter KNN prefilter: Falls back to brute-force scan when prefilter result set is small. (#6730)

Replica expired-key deletion: Replicas proactively delete expired keys on reads. --replica_delete_expired (default true). (#6985)

New Prometheus metrics: Pipeline latency histogram (dragonfly_pipeline_latency_seconds), TLS handshake counter (tls_handshakes_total), stream access patterns (stream_accesses_total), pipeline blocking counter. (#6688, #7015, #6767, #6685)

EKS Pod Identity for S3: AWS credential chain supports EKS Pod Identity and ECS task roles. (#6917)

Early TLS filter and TCP_DEFER_ACCEPT: Drops zombie connections at OS level before allocating fiber/OpenSSL state. (#6857)

Memcached io_loop_v2 enabled by default*: Async I/O with deferred replies. (#6700)

Incremental SBF replication: Scalable Bloom Filter chunks flushed incrementally, bounding peak memory. (#7034)

What's Changed
Huge thanks to all the contributors! ❤️
New Contributors

Full Changelog: https://github.com/dragonflydb/dragonfly/compare/v1.37.0...v1.38.0

View originalPermalink
How v1.38.0 went

v1.37.2

Changed 1
  • Improve performance of SETBIT operation
Fixed 2
  • JSON.NUMINCRBY negative result overflow
  • Crash for XREAD BLOCK with replication
This is a patch release
What's Changed
  • fix(json): JSON.NUMINCRBY negative result overflow (#6981)
  • fix(streams): crash for XREAD BLOCK with replication (#6980)
  • fix(bitops): Improve performance of SETBIT operation (#6745)

Full Changelog: https://github.com/dragonflydb/dragonfly/compare/v1.37.0...v1.37.2

View originalPermalink
How v1.37.2 went

v1.37.0

Added 4
  • Support SORT command including BY and GET options
  • Add support for DIGEST and DELEX commands
  • Add NOVALUES flag to HSCAN to omit values
  • Add pagination to cross-shard search
Changed 6
  • Significantly reduce memory usage around JSON documents
  • Reduce vector search memory usage by 40% with hash map documents
  • Improve OAHSet::Find() performance
  • Update jsoncons to 1.5.0
  • Switch to C++20
  • Remove quicklist from the codebase
Fixed 6
  • Fix several bugs around streams
  • Support parenthesized star in FT.SEARCH queries
  • SPOP command now returns random member even if it contains null bytes
  • Set error type when returning -NOGROUP error
  • Fix memory calculation for OAHSet
  • Fix S3 snapshot saving

Dragonfly v1.37.0

Important stability fixes and changes:
  • Significant memory reduction around json documents #6511
  • Vector search memory usage is 40% less with hash map documents: #6436 #6437
  • Support of SORT command - including BY and GET options.
  • Several bug fixes around streams: #6506 #6492 #6532
  • Added support for DIGEST and DELEX commands: #6328
What's Changed
Huge thanks to all the contributors! ❤️
New Contributors

Full Changelog: https://github.com/dragonflydb/dragonfly/compare/v1.36.0...v1.37.0

View originalPermalink
How v1.37.0 went

v1.36.0

Added 6
  • Support Global Vector index
  • Support unicode tags
  • Add CSS option for FT.CREATE
  • Add ftsearch result parsing for css
  • Add common label support to the helm chart
  • Add tiering basic metrics
Changed 5
  • Better memory defragmentation for json objects
  • Load tiered values in read-only for hset
  • Parse JSON on destination shard
  • Change the resolution of reply latency measurement to nanoseconds
  • Use stateless allocator for JSON
Fixed 9
  • Django-cacheops compatibility fixes
  • Result set cutoff in search
  • Remove duplicate expired/evicted metric header
  • macOS build
  • Remove index docs on eviction and cluster migration
  • Upload strategy for tiering

Dragonfly v1.36.0

Important stability fixes and changes:
  1. Support Global Vector index #6103
  2. Support unicode tags in #6127
  3. django-cacheops compatibility fixes: #6123 #6129
  4. better memory defragmentation for json objects: #6240 #6276
What's Changed
Huge thanks to all the contributors! ❤️
New Contributors

Full Changelog: https://github.com/dragonflydb/dragonfly/compare/v1.35.0...v1.36.0

View originalPermalink
How v1.36.0 went

v1.34.2

Fixed 1
  • Don't accumulate deleted bytes if there is no RSS eviction in cache mode
This is a patch release

It is strongly advised to update to this version if you use 1.34.0 / 1.34.1 due to regression when Dragonfly runs in cache mode

What's Changed

Full Changelog: https://github.com/dragonflydb/dragonfly/compare/v1.34.1...v1.34.2

View originalPermalink
How v1.34.2 went
View all

Discussion