This is an automated email from the ASF dual-hosted git repository.

git-hulk pushed a commit to branch blog-release-2-16-0
in repository https://gitbox.apache.org/repos/asf/kvrocks-website.git

commit 0e218e58b16abecbe6e9b997c902b314f9e9e7c7
Author: git-hulk <[email protected]>
AuthorDate: Mon Jun 22 21:03:53 2026 +0800

    Add release blog for Apache Kvrocks 2.16.0
    
    Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
---
 blog/2026-06-22-release-2-16-0/index.md | 99 +++++++++++++++++++++++++++++++++
 1 file changed, 99 insertions(+)

diff --git a/blog/2026-06-22-release-2-16-0/index.md 
b/blog/2026-06-22-release-2-16-0/index.md
new file mode 100644
index 00000000..55aeace0
--- /dev/null
+++ b/blog/2026-06-22-release-2-16-0/index.md
@@ -0,0 +1,99 @@
+---
+slug: release-2-16-0
+title: "Apache Kvrocks Release 2.16.0"
+authors: [hulk]
+---
+
+Apache Kvrocks 2.16.0 lands with one of the strongest feature batches of the 
2.x line — extending the `SET` command with native compare-and-set, adding 
operator-friendly traffic control via `CLIENT PAUSE`/`UNPAUSE`, sharpening 
cluster slot management with `CLUSTERX FLUSHSLOTS`, and growing the 
probabilistic-data-structure surface with `TDIGEST.TRIMMED_MEAN`.
+
+Redis 7.0+ command compatibility moves another step forward through `BITPOS` 
`BYTE`/`BIT` range units, `CLIENT SETINFO`, and the `LATENCY` family. Under the 
hood, RocksDB is upgraded to v11.1.1, and a broad round of security hardening 
(Lua CVE patches, replication tightening, RDB validation) ships alongside.
+
+**Highlights:**
+
+- **Conditional SET operations (IFEQ/IFNE/IFDEQ/IFDNE)** — Atomic 
compare-and-set patterns are now supported natively in `SET`, enabling 
optimistic locking without a `GET`/`SET` round-trip.
+- **CLIENT PAUSE / UNPAUSE** — Operators can pause client traffic during 
failover windows without closing connections.
+- **CLUSTERX FLUSHSLOTS** — Drop all keys in one or more slot ranges in a 
single command — useful for slot rebalancing and tenant cleanup in cluster mode.
+- **TDIGEST.TRIMMED_MEAN** — Compute a trimmed mean over a t-digest sketch, 
completing the streaming quantile/aggregation toolkit.
+- **BITPOS with BYTE / BIT range units** — `BITPOS` now matches Redis 7.0+ 
semantics for byte-indexed and bit-indexed ranges.
+
+<!--truncate-->
+
+### Conditional SET operations (IFEQ / IFNE / IFDEQ / IFDNE)
+
+Kvrocks 2.16.0 extends the `SET` command with four new conditional modifiers. 
`IFEQ <value>` applies the write only when the stored value equals the supplied 
value; `IFNE <value>` inverts that condition. The `IFDEQ <digest>` and `IFDNE 
<digest>` variants compare against a 16-character hex digest of the stored 
value instead of the full payload — useful when the stored value is large and 
you'd rather ship a short fingerprint over the wire. Together these let you 
implement optimistic-lockin [...]
+
+```bash
+# Set "newvalue" only if the current value equals "oldvalue"
+127.0.0.1:6666> SET mykey newvalue IFEQ oldvalue
+
+# Set "newvalue" only if the current value's 16-char digest matches the 
expected one
+127.0.0.1:6666> SET mykey newvalue IFDEQ 0123456789abcdef
+```
+
+For more information, please see [PR 
#3475](https://github.com/apache/kvrocks/pull/3475) and [PR 
#3453](https://github.com/apache/kvrocks/pull/3453).
+
+### CLIENT PAUSE / UNPAUSE
+
+`CLIENT PAUSE` and `CLIENT UNPAUSE` give operators a clean way to quiesce 
client traffic without tearing down connections. The primary use case is 
controlled failover: pause writes (or all traffic) on the primary, let replicas 
catch up, promote — then unpause. Before this command existed, operators had to 
choose between disconnecting all clients or accepting dirty reads during the 
switchover window. Both subcommands require the admin permission.
+
+```bash
+# Pause all client commands for up to 5 seconds (useful during a planned 
failover)
+127.0.0.1:6666> CLIENT PAUSE 5000 ALL
+
+# Or pause only write commands and keep reads flowing
+127.0.0.1:6666> CLIENT PAUSE 5000 WRITE
+
+# Resume immediately once the failover is complete
+127.0.0.1:6666> CLIENT UNPAUSE
+```
+
+For more information, please see [PR 
#3378](https://github.com/apache/kvrocks/pull/3378).
+
+### CLUSTERX FLUSHSLOTS
+
+Cluster operators can now drop all keys belonging to one or more slot ranges 
with a single command. This is the operation you reach for when reclaiming 
slots after a tenant is removed, cleaning up after a partial migration, or 
resetting a node's data set before re-sharding. The command refuses to run 
while a slot migration is in progress, so it can't be misused mid-rebalance.
+
+```bash
+# Flush every key in slots 0-100 and 8000-8500
+127.0.0.1:6666> CLUSTERX FLUSHSLOTS 0-100 8000-8500
+
+# A single slot is accepted as a degenerate range
+127.0.0.1:6666> CLUSTERX FLUSHSLOTS 4242-4242
+```
+
+For more information, please see [PR 
#3375](https://github.com/apache/kvrocks/pull/3375).
+
+### TDIGEST.TRIMMED_MEAN
+
+The t-digest command family adds `TDIGEST.TRIMMED_MEAN`, which computes the 
mean of a sketch after discarding the lowest and highest tails. This is the 
standard way to summarize a long-tailed latency or value distribution without 
letting outliers dominate the average. Both cut quantiles must be in `[0, 1]`, 
and the low cut must be strictly less than the high cut.
+
+```bash
+# Build a sketch
+127.0.0.1:6666> TDIGEST.CREATE latency
+127.0.0.1:6666> TDIGEST.ADD latency 12 14 9 11 13 250 300
+
+# Mean of the middle 80% — excludes the bottom 10% and top 10%
+127.0.0.1:6666> TDIGEST.TRIMMED_MEAN latency 0.1 0.9
+```
+
+For more information, please see [PR 
#3312](https://github.com/apache/kvrocks/pull/3312).
+
+### BITPOS with BYTE / BIT range units
+
+`BITPOS` now accepts an explicit range unit — `BYTE` (the default, preserving 
prior behavior) or `BIT` — matching the Redis 7.0+ semantics. When `BIT` is 
supplied, the `start` and `end` arguments are interpreted as bit offsets rather 
than byte offsets, which is what you want when scanning inside packed bitmaps 
or fixed-width bitfield encodings.
+
+```bash
+127.0.0.1:6666> SET mykey "\x00\xff\xf0"
+
+# Find the first set bit treating start/end as bit offsets
+127.0.0.1:6666> BITPOS mykey 1 0 -1 BIT
+
+# Same range, but interpreted as bytes (the default and prior behavior)
+127.0.0.1:6666> BITPOS mykey 1 0 -1 BYTE
+```
+
+For more information, please see [PR 
#3460](https://github.com/apache/kvrocks/pull/3460).
+
+## End
+
+Beyond these highlights, 2.16.0 also lands `CLIENT SETINFO`, the `LATENCY 
HISTOGRAM` subcommand, dictionary compression settings, per-worker CPU time in 
`INFO cpu`, `CLUSTER NODES` slave-failure propagation, expanded `KMETADATA` 
output, `DUMP` for the SortedInt type, and a substantial security hardening 
batch (two Lua CVEs, LuaJIT bytecode rejection, stricter replication 
permissions, RDB intset validation). For the full list of changes, please refer 
to the [Apache Kvrocks 2.16.0 changelo [...]

Reply via email to