# Dragonfly v1.39.0 - Product: Dragonfly (https://whatsnew.fyi/product/dragonfly) - Vendor: DragonflyDB - Date: 2026-06-09 - Version: v1.39.0 - Original notes: https://github.com/dragonflydb/dragonfly/releases/tag/v1.39.0 - Permalink: https://whatsnew.fyi/product/dragonfly/releases/v1.39.0 What's New is an index, not a publisher: every entry below links to the vendor's own release notes, which are the authoritative source. Entries are labelled where they are hand-curated sample data, pre-releases, or drawn from a secondary source such as a developer blog. Reuse: the summaries, labels and curation here are © What's New. Quote freely with attribution and a link back; wholesale republication of the corpus is not permitted — terms: https://whatsnew.fyi/terms. The vendors' own release notes remain their publishers'. --- - **added** — 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 - **added** — 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 - **added** — Add BM25STD (Okapi BM25) relevance scoring engine with per-field TF and document-length tracking - **added** — Add TFIDF and TFIDF.DOCNORM scorer options for FT.SEARCH, FT.PROFILE, and FT.AGGREGATE - **added** — Add WITHSCORES and SCORER parameters to FT.SEARCH - **added** — Add ADDSCORES parameter to FT.AGGREGATE to inject a __score field for downstream GROUPBY/SORTBY/REDUCE on relevance - **added** — Add porter stemming by default for TEXT fields via vendored Snowball/libstemmer library with per-field NOSTEM, index-level LANGUAGE, and per-document LANGUAGE_FIELD support - **added** — Add --container_iteration_yield_interval_usec flag to configure periodic shard fiber yielding for long-running container iteration commands - **added** — Add --use_oah_set flag to select OAHSet as alternative in-memory set backend - **added** — Add foundational zero-copy GET infrastructure to CompactObj and LargeString with TryBorrow() returning Copy-on-Write encoded views - **added** — Add serialization_tagged_chunks flag to split large RDB entries into tagged chunks with envelope IDs and per-blob compression - **added** — Add four new Prometheus metrics on replica instances: dragonfly_master_link_status, dragonfly_master_last_io_seconds_ago, dragonfly_sync_in_progress, and dragonfly_slave_repl_offset - **added** — Add --cluster_coordinator_connect_timeout_ms and --cluster_coordinator_response_timeout_ms flags to control coordinator-to-shard timeouts - **changed** — 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 - **changed** — INFO REPLICATION and replica memory stats are now served lock-free via per-proactor thread-local snapshots - **changed** — Replace global RCU-based ChannelStore with ShardedHashMap using 16 independent shard locks for pub/sub - **changed** — Tiered hashes are now mutable - **changed** — 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** — Fix NotifyWatchQueue to exit in O(1) when a watched key is absent instead of O(N) over all waiters - **fixed** — Fix zombie-key cleanup across SORT, ZUNIONSTORE, ZINTERSTORE, SHRINK, and hash TTL commands to prevent empty containers in keyspace - **security** — 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, _[Truncated at 4000 characters — full notes: https://github.com/dragonflydb/dragonfly/releases/tag/v1.39.0]_