Skip to content

Releases: apache/kvrocks

2.16.0

21 Jun 16:16

Choose a tag to compare

Highlights: This release continues to improve Redis compatibility and operational visibility. New command coverage includes CLIENT PAUSE/CLIENT UNPAUSE, CLIENT SETINFO, LATENCY, TDIGEST.TRIMMED_MEAN, BITPOS BYTE/BIT range units, conditional SET options (IFEQ, IFNE, IFDEQ, IFDNE), DUMP support for the SortedInt type, and CLUSTERX FLUSHSLOTS for clearing slot ranges in cluster mode.

This version also strengthens cluster and observability workflows by propagating slave failure state in CLUSTER NODES, exposing worker thread CPU time, adding more KMETADATA output, and introducing dictionary compression settings.

Stability and security were improved with Lua and LuaJIT hardening, safer replication/fullsync handling, stricter command permissions, RDB malformed intset validation, data race fixes, and multiple correctness fixes across Streams, Geo, TDigest, Set, ZSet, HyperLogLog, and scripting. Dependencies were also refreshed, including RocksDB v11.1.1, jsoncons v1.7.0, jemalloc v5.3.1, oneTBB v2023.0.0, zlib v2.3.3, and fast_float v8.2.7.

This release contains internal groundwork for Hash Field Expiration, but the HFE user-facing feature was disabled for the 2.16.0 release and should not be treated as available functionality in this version.

New Features

  • feat(rdb): add DUMP support for SortedInt type by @Zakir032002 in #3366
  • feat(command): add FLUSHSLOTS command to clear keys in specified slot ranges in cluster mode by @sryanyuan in #3375
  • feat(info): add thread CPU time measurement for worker thread monitoring by @sryanyuan in #3379
  • feat(client): Add support for the CLIENT PAUSE/UNPAUSE commands to provide a temporary solution for failover by @Paragrf in #3378
  • feat(cluster): propagate slave failure state via CLUSTER NODES fail flag by @Paragrf in #3386
  • feat(tdigest): implement TDIGEST.TRIMMED_MEAN command by @chakkk309 in #3312
  • feat: Add support for dictionary compression settings by @nagisa-kunhah in #3425
  • feat(commands): expose hash, list and json metadata in kmetadata by @PragmaTwice in #3454
  • feat(string): add digest length validation for DelEX IFDEQ/IFDNE by @kirito632 in #3453
  • feat(server): implement LATENCY command set (Redis 7.0+ compatibility) by @gongna-au in #3461
  • feat(commands): implement CLIENT SETINFO subcommand by @gongna-au in #3465
  • feat(bit): add BYTE/BIT option support for BITPOS command by @gongna-au in #3460
  • feat(string): support IFEQ/IFNE/IFDEQ/IFDNE in SET command by @kirito632 in #3475

Bug Fixes

  • fix(stream): accept ~ modifier in XADD and XTRIM by @XYenon in #3403
  • fix(server): data race when accessing the db scan infos in GetLatestKeyNumStats by @songqing in #3414
  • fix(conf): cap proto-max-bulk-len to 4 GiB instead of UINT64_MAX by @songqing in #3419
  • fix(stream): correct subkey prefix encoding in DestroyGroup by @songqing in #3420
  • fix(zset): initialize *inter_cnt before early return in InterCard by @songqing in #3421
  • fix(string,hash): use compact float format in IncrByFloat to match Redis by @songqing in #3427
  • fix(set): propagate storage errors in Set instead of treating as NotFound by @songqing in #3428
  • fix(command): fix static initialization crash on Kunpeng/Kylin platform by @sryanyuan in #3416
  • fix(stream): correct XREVRANGE minimum argument count from 2 to 4 by @songqing in #3438
  • fix(geo): use strict weak ordering in sortGeoPointDESC comparator by @songqing in #3439
  • fix(tdigest): merge into existing dest without OVERRIDE by @Tangruilin in #3412
  • fix(tdigest): correct TDIGEST.MERGE parser for COMPRESSION parameter by @Tangruilin in #3449
  • fix(hyperloglog): use namespace-prefixed key in PFMERGE GetMetadata by @songqing in #3441
  • fix(stream): allow group and consumer names starting with digits by @songqing in #3442
  • fix(geo): delete store_key instead of user_key in SearchStore by @songqing in #3456
  • fix(geo): make geo store commands return the resulting set size with COUNT by @jihuayu in #3457
  • fix(tdigest): fix incorrect min/max default initialization by @Tangruilin in #3463
  • fix(stream): align XPENDING ID parsing and PEL range with XRANGE (incomplete IDs, exclusive bounds) by @songqing in #3437
  • fix(scripting): reject negative FCALL key count by @songqing in #3466
  • fix(bitfield): support Redis positional '#N' offset syntax by @nkroker in #3470
  • fix(zset): register zdiffstore as write command by @jihuayu in #3486

Security & Hardening

  • fix(script): upgrade Lua version to fix CVE-2024-31449 and CVE-2025-49844 by @jihuayu in #3435
  • fix(command): APPLYBATCH should use the admin permission by @git-hulk in #3458
  • fix(replication): require admin for transfer commands by @git-hulk in #3484
  • fix(replication): reject unsafe fullsync file names by @git-hulk in #3483
  • fix(scripting): bump LuaJIT to reject bytecode loading by @git-hulk in #3492
  • fix(scripting): sanitize lua error replies by @jihuayu in #3494
  • fix(rdb): reject malformed intset lengths by @git-hulk in #3519
  • chore(security): add draft threat model and SECURITY.md for security-model discoverability by @potiuk in #3509

Improvements

  • refactor: use stderr for CLI error output by @sanjana2505006 in #3372
  • chore(util): replace strtof/strtod with fast-float by @PragmaTwice in #3394
  • chore(config): remove the deprecated configuration rocksdb.max_background_{compactions,flushes} and set default to -1 by @yatriks in #3398
  • chore(scan): remove additional abstraction for subkey scanning by @PragmaTwice in #3490

Hash Field Expiration Groundwork (Disabled in 2.16.0)

Build & CI

  • chore(ci): bump golang lint to v2.9.0 by @aleksraiden in #3370
  • chore(ci): bump all used actions to latest by @aleksraiden in #3383
  • chore(ci): bump docker/build-push-action to v7 by @aleksraiden in #3384
  • chore(ci): Use the lastest version of clang-format-18 & clang-tidy-18 by @jihuayu in #3389
  • chore(ci): fix sonarcloud security hotspots by @jihuayu in #3392
  • chore(ci): use git-hash in actions for ASF actions approval list by @LindaSummer in #3400
  • fix(ci): failure in macOS due to the unavailable cmake version by @git-hulk in #3415
  • chore(ci): bump typos action to version 1.45.0 by @aleksraiden in #3422
  • fix(ci): add check-and-lint success as a merge condition by @jihuayu in #3423
  • chore(ci): Update paths-filter and header action versions by @jihuayu in #3426
  • fix(ci): modify Redis build cache keys by @jihuayu in #3430
  • build: disable LTO by default by @PragmaTwice in #3440
  • feat(ci): add caching for CMake FetchContent in CI workflow by @jihuayu in #3448
  • chore(build): Move environment variables from RUN to dedicated ENV instruction by @aleksraiden in #3477
  • chore(build): jemalloc disable flag for ArchLinux build by @aleksraiden in h...
Read more

2.15.0

27 Feb 01:57

Choose a tag to compare

Highlights: This release expands command coverage with new TimeSeries commands and broader TDigest support. It also introduces new commands such as DELEX, DIGEST, and MSETEX, and adds the redis-databases option to enable SELECT support, further improving Redis compatibility.

In addition, this version improves stability and correctness by fixing replication acknowledgment handling and preventing WAL exhaustion caused by slow consumers. Several dependency upgrades were included, notably RocksDB updates up to v10.10.1 and the migration to C++20.

New Features

  • feat(ts): add the support of TS.MREVRANGE command by @var-nan in #3245
  • feat(ts): add the support of TS.QUERYINDEX command by @lauk20 in #3246
  • feat(ts): add the support of TS.ALTER command by @var-nan in #3264
  • feat(tdigest): add the support of TDIGEST.RANK command by @donghao526 in #3249
  • feat(tdigest): add the support of TDIGEST.REVRANK command by @donghao526 in #3130
  • feat(tdigest): add the support of TDIGEST.BYRANK and TDIGEST.BYREVRANK command by @donghao526 in #3296
  • feat: add redis-databases option to support SELECT command by @hanxi in #3294
  • feat(digest): implement DIGEST command by @chakkk309 in #3320
  • feat(delex): implement DELEX command by @Valay17 in #3317
  • feat(string): add the support of MSETEX command by @ggyuchive in #3318
  • chore(command): add a special category to disable commands by @PragmaTwice in #3251

Bug Fixes

  • fix(replication): fix _getack send check by @zhixinwen in #3248
  • fix(replication): prevent WAL exhaustion from slow consumers by @ethervoid in #3357
  • fix(info): the slave lag in INFO command might be overflowed by @greatsharp in #3271
  • fix(command): enhance zdiff parse error case to avoid crash by @ggyuchive in #3316
  • fix(command): fix MSETEX key range for command by @ggyuchive in #3336
  • fix(stream): add missing return after empty response in XREAD/XREADGROUP OnWrite by @nsweeting in #3337
  • fix(string): add empty string value check for INCR to match Redis behavior by @sryanyuan in #3354
  • fix(sideloading): avoid the expected data deletion during SST side loading by @ltagliamonte-dd in #3342
  • fix(ci): the sonar c/cpp action has been deprecated by @git-hulk in #3280
  • fix(ci): use the wrong string in sonar action arguments by @git-hulk in #3284

Performance Improvements

  • perf(string): reduce read access in MSETEX by @ggyuchive in #3322
  • perf(hash): use MultiGet to reduce RocksDB calls in HMSET by @sryanyuan in #3327
  • refactor(tdigest): convert the flags for reverse in TDigest::Rank to a compile-time argument by @donghao526 in #3268

Build & CI

Chores & Maintenance

New Contributors

Full Changelog: v2.14.0...v2.15.0

2.14.0

11 Nov 15:23

Choose a tag to compare

Highlights

Added WAIT — Blocks after a write until N replicas acknowledge (or timeout), returning the ack count. Enables synchronous-style replication for stronger durability and consistency in Kvrocks.

Added T-Digest — Probabilistic data type for fast, memory-efficient approximate percentiles on streams and large datasets. Ideal for latency histograms, telemetry, and anomaly detection. See supported commands.

Lua scripting: strict key-access mode — Enforces access only to keys declared via EVAL/FCALL. In this mode the global lock is removed, delivering much higher concurrency and throughput. Recommended for workloads that heavily use Lua scripts.

Dep Updates — RocksDB is upgraded to version 10.6.2 in this release.

Other notable updates — Added RISC-V support; significant replication performance/stability improvements; and Search enhancements, including a compaction filter and skipping expired keys during queries.

New features

  • feat(replication): implement WAIT without timeout support by @zhixinwen in #3047
  • feat(tdigest): add TDIGEST.MERGE command implementation by @LindaSummer in #3054
  • feat(replication): make replication delay configurable by @zhixinwen in #3087
  • feat(namespace): add a subcommand to show the current ns name by @PragmaTwice in #3088
  • feat(replication): clean up all wait_contexts in CleanupWaitConnection by @zhixinwen in #3104
  • feat(replication): replication support group sync by @zhixinwen in #3092
  • feat(function): support subcommand FUNCTION FLUSH by @PragmaTwice in #3119
  • feat: Add support for RISC-V architecture by @wanghan-sanechips in #3053
  • feat(replication): WAIT cmd supports timeout by @zhixinwen in #3117
  • feat(scripting): support strict key-accessing mode for lua scripting by @PragmaTwice in #3139
  • feat(config): add RocksDB periodic compaction controls by @sryanyuan in #3170
  • feat(info): expose RocksDB level file count and pending compaction bytes via info by @sryanyuan in #3181
  • feat(replication): add replication-no-slowdown config by @zhixinwen in #3219

Improvements

  • feat(replication): implement WAIT based on replica acks by @zhixinwen in #3061
  • feat(replication): set low watermark when reading replication data by @zhixinwen in #3098
  • feat(function): propagate FUNCTION FLUSH/DELETE to replicas by @PragmaTwice in #3121
  • feat(Dockerfile): use a numeric UID instead of a username by @SpecLad in #3138
  • feat(script): make EVAL & FCALL exclusive if lua-strict-key-accessing is disabled by @PragmaTwice in #3155
  • feat(command): return all flags in COMMAND INFO by @PragmaTwice in #3160
  • feat(replication): optimize wait and replication locks by @zhixinwen in #3090
  • feat(search): support to skip expired keys in query by @PragmaTwice in #3086
  • feat(replication): implement _getack for quick WAIT response by @zhixinwen in #3075
  • feat(search): add a compaction filter for search column family by @PragmaTwice in #3084
  • chore(common): refactor parse utils via std::from_chars by @PragmaTwice in #3052
  • build: disable LTO in debug mode by @PragmaTwice in #3069
  • chore(metadata): optimize RedisTypeNames & make timeseries an emptyable type by @PragmaTwice in #3083
  • chore(function): make LUA_GC_CYCLE_PERIOD a global constant by @PragmaTwice in #3116
  • chore: remove unused autoResizeBlockAndSST method and config by @jonahgao in #3136
  • chore(config): enable level_compaction_dynamic_level_bytes by default by @jonahgao in #3144
  • perf(storage): eliminate unnecessary rocksdb::DB::ListColumnFamilies() by @jonahgao in #3145
  • build: fix build with Homebrew Clang on macOS by @sryanyuan in #3154
  • perf(scan): optimise scan performance when scanning keys with a tag by @sryanyuan in #3156
  • perf(repl): only calculate crc of fetched file when needed by @jonahgao in #3161
  • refactor(storage): optimize MDel with MultiGet options by @cyningsun in #3195
  • chore(cluster): check and send the migration batches when the buffer is full by @hll1213181368 in #3227

Bug fixes

  • fix(config): the default log-dir should include stdout by @PragmaTwice in #3085
  • fix(migration): send migration batch while full to avoid oom by @greatsharp in #3094
  • fix(search): support number literal for tag fields by @zhenghaoz in #3096
  • fix(key): check status returned from SETEX and PSETEX by @hll1213181368 in #3108
  • fix(hscan): HSCAN support NOVALUES by @LiuQhahah in #3109
  • fix(search): support escaped character in tags by @zhenghaoz in #3110
  • fix(function): reset lua states from all workers in FUNCTION DELETE by @PragmaTwice in #3115
  • fix(search): convert query tag to lowercase if case insensitive by @zhenghaoz in #3118
  • fix(search): wrong upper bound in reverse scan for infinity by @zhenghaoz in #3124
  • fix(replication): Fix Seg Fault On Signal When Replication is Enabled by @zhixinwen in #3131
  • fix(scan): pattern-based SCAN iterations may skip remaining keys by @sryanyuan in #3146
  • fix(namespace): set token can delete another namespace by @jonahgao in #3149
  • fix(test): flaky test case in KMETADTA command by @git-hulk in #3150
  • fix(repl): check the status of listing checkpoint files by @jonahgao in #3158
  • fix(list): check the status of rocksdb iterator by @jonahgao in #3168
  • fix(stream): XPENDING won't return the idle and deliver count when reading with id '<' by @git-hulk in #3185
  • fix(ts): Disable TS.MGET/MRANGE in cluster mode by @yezhizi in #3182
  • fix(json): allow to insert at t...
Read more

2.13.0

05 Aug 14:30

Choose a tag to compare

Highlights

This new release introduces significant features, improvements, and fixes.
A critical fix is that the server will crash when using ZRANDMEMBER for non-existent keys, please see #2982.

We introduce a few new commands and enhance some old commands, including:

  • CLIENT REPLY to allow clients to control server reply behavior
  • KPROFILE to enable/disable/dump the memory profiling
  • FLUSHMEMTABLE to flush memtables
  • FLUSHBLOCKCACHE to explicitly release the block cache

Another highlight is that the community is working to support the TDIGEST data structure, but we don't bring it to this release for stable consideration.

New Features

  • feat(cmds): Add support for CLIENT REPLY subcommand and related tests by @DCjanus in #2943
  • feat(tdigest): Add support for QUANTILE command by @SharonIV0x86 in #2849
  • feat(command): add a new command to enable/disable/dump the memory profiling by @git-hulk in #3007
  • feat(command): Add redis command to flush memtables by @Ryan4253 in #3022
  • feat(command): add new command to release block cache by @sryanyuan in #3049

Improvements

Bug Fixes

  • fix(protocol): inline mode should allow the quoted string by @git-hulk in #2873
  • fix: typo in compaction checker by @geonove in #2879
  • fix(tdigest): fix centroid encoding overwrite for same mean by @LindaSummer in #2878
  • feat(storage): support for sideloading SSTs by @ltagliamonte-dd in #2845
  • fix(stream): should return an empty string instead of nil in XREAD/XRANGE by @git-hulk in #2897
  • feat(script): pass storage context through scripting by @PragmaTwice in #2901
  • fix(core): potential data race between blocking command and transaction by @git-hulk in #2910
  • fix(zset): wrong RESP reply in ZRANDMEMBER and ZMSCORE command by @weim0000 in #2937
  • fix(zset): crash in ZRANDMEMBER for non-existent keys by @weim0000 in #2982
  • fix(zset): wrong RESP reply in ZMSCORE command for non-existent key by @weim0000 in #2983
  • fix(list): dst-key's version is 0 in rpoplpush cmd for non-existent dst-key by @weim0000 in #2985
  • fix(stream): ensure XINFO STREAM command has enough arguments by @rmsacks in #2994
  • fix(search): missing the indexing phase for scripting by @PragmaTwice in #2998
  • fix(txn): wrong RESP reply for EXEC if error occurred in commit by @PragmaTwice in #2996
  • fix(event): should log reason string instead of id in EventListener::OnFlushCompleted by @Ryan4253 in #3012
  • fix(storage): don't try to commit empty write batches by @nathanlo-hrt in #3015
  • fix: Unset change_level if level_compaction_dynamic_level_bytes is enabled by @hotpxl in #3020
  • fix(core): remove extraneous RocksDB::CancelAllBackgroundWork calls (#3017) by @Ryan4253 in #3019
  • fix(core): Avoid hardcoding RocksDB property strings by @Ryan4253 in #3029
  • fix(config): Parse rocksdb.max_bytes_for_level_base as uint64_t by @Ryan4253 in #3032
  • fix(config): Setting rocksdb.level0_slowdown_writes_trigger to 0 disables it by @Ryan4253 in #3034
  • fix(config): the default log-dir should include stdout by @PragmaTwice in #3085

Misc

New Contributors

Read more

2.12.1

06 May 14:17

Choose a tag to compare

This release is a patch release that addresses several important bug fixes. Users of old versions are strongly encouraged to upgrade to this new version.

Bug Fixes

  • fix(core): potential data race between blocking command and transaction by @git-hulk in #2910
  • chore: fix & cleanup RESP error messages by @PragmaTwice in #2902
  • fix(stream): should return an empty string instead of nil in XREAD/XRANGE by @git-hulk in #2897

2.12.0

22 Apr 05:07

Choose a tag to compare

Highlights

This new release introduces significant features, improvements, and fixes. A critical fix is that the server will crash when passing a negative offset in SETRANGE command, please see #2783.

We introduce a few new commands and enhance some old commands, including:

  • HSETEXPIRE to allow setting a hash field with expiration time
  • KMETADATA to fetch the metadata of a key
  • POLLUPDATES supports using RESP output format
  • LASTSAVE supports iso8601 time format

Another highlight is that the community is working to support the TDIGEST data structure, but we don't bring it to this release for stable consideration.

New Features

  • feat(command): add support of RESP output format for the POLLUPDATES command by @git-hulk in #2745
  • feat(hash): add the support of HSETEXPIRE command (HSET + EXPIRE) by @ltagliamonte-dd in #2750
  • feat(server): add rocksdb_version, server_time_usec, executable and config_file to INFO by @PragmaTwice in #2781
  • feat(info): support to specify multiple sections for INFO by @PragmaTwice in #2772
  • feat(tdigest): add TDIGEST.CREATE and TDIGEST.INFO command by @LindaSummer in #2799
  • feat(tdigest): add tdigest algorithm and storage encoding implementations by @LindaSummer in #2741
  • feat(config): allow to configure the rocksdb's max compaction bytes by @git-hulk in #2802
  • feat(tdigest): add TDIGEST.ADD command by @wyxxxcat in #2803
  • feat(tdigest): add TDIGEST.MAX/MIN command by @wyxxxcat in #2811
  • feat(cmd): add iso8601 time format parameter to LASTSAVE command by @SharonIV0x86 in #2822
  • feat(tdigest): add support of TDIGEST.RESET command by @SharonIV0x86 in #2826
  • feat(cmd): add new command KMETADATA by @ltagliamonte-dd in #2827

Improvements

  • feat(script, function): remove global lock for EVAL, EVALSHA and FCALL by @PragmaTwice in #2731
  • feat(main): refine shutdown message to show signal name by @PragmaTwice in #2733
  • chore(command): add admin flag for permission-required commands by @PragmaTwice in #274
  • feat(info): move the last scan time as field to the info keyspace section by @git-hulk in #2775
  • refactor: adding stream elements to response by @torwig in #2836
  • chore(metadata): wrap RedisTypeNames as a method by @PragmaTwice in #2838
  • feat(conn): optimize RESP reply functions by @PragmaTwice in #2847
  • feat(tdigest): refactor buffer merge's min max updating logic by @LindaSummer in #2814

Bug Fixes

  • fix(script): disable exclusive commands to be executed in scripting by @PragmaTwice in #2732
  • chore(x.py): fix several typing issue in x.py by @PragmaTwice in #2739
  • feat(script): allow blocking commands in scripting by @PragmaTwice in #2740
  • chore(config): enable the RESP3 potocol by default by @git-hulk in #2746
  • fix(tests): flaky test case in BLMPOP command by @git-hulk in #2754
  • fix(tls): remove SSL_sendfile path to avoid errors in replication fullsync by @PragmaTwice in #2757
  • ci: fix build-push-action by supplying context argument by @PragmaTwice in #2780
  • fix(string): the server will crash when passing a negative offset in SETRANGE command by @git-hulk in #2783
  • fix(zset): The ZREMRANGEBYRANK command is missing LogData of the zset data type by @sryanyuan in #2808
  • fix: access nullptr issue in LoadClusterNodes by @RiversJin in #2820
  • fix(cluster): Resolve forbidden slot range cleanup bug during slot mgration by @RiversJin in #2829
  • fix(bloom): crash due to pinnable slice in bloom filter by @mapleFU in #2843
  • fix(bloom): try to fix GetSelf invalid access by @mapleFU in #2867

Misc

New Contributors

Read more

2.11.1

07 Feb 12:21

Choose a tag to compare

This release is a patch release which includes several important bug fixes (including the security fix for CVE-2025-25069).

Users of old versions are strongly encouraged to upgrade to this new version.

Bug Fixes:

  • fix(tls): remove SSL_sendfile path to avoid errors in replication fullsync by @PragmaTwice in #2757
  • fix(conn): detect and drop HTTP requests in connection by @PragmaTwice in #2765

Misc:


Full Changelog: v2.11.0...v2.11.1-rc1

2.11.0

26 Jan 06:06

Choose a tag to compare

Highlights

Note that RocksDB has been upgraded from v9.3.1 to v9.10.0 in this version.

We are excited to announce the release of Kvrocks Search in this version, which gives Kvrocks the ability of secondary indexing and structured querying. You can find detailed information on the website. Please note that this feature is still experimental, and you can provide feedback through GitHub Issues if you encounter any problems.

New Features

  • feat: support histograms for command latency statistics by @rabunkosar-dd in #2721
  • feat(search): support the FT.TAGVALS command by @jonathanc-n in #2564
  • feat(worker): Allow passing a socket FD to dup and listen on by @nathanlo-hrt in #2598
  • feat(config): support retrieving configuration fields using glob patterns by @sryanyuan in #2592
  • feat(config): add rocksdb.wal_compression to allow enable wal compression by @paragor in #2607
  • feat(config): add rocksdb.compression_start_level to allow configure levels without compression by @paragor in #2605
  • feat(keys, scan): Support arbitrary glob patterns by @nathanlo-hrt in #2608
  • feat(cluster): add support of the JSON type in cluster migration by @git-hulk in #2654
  • feat(config): make rocksdb.dump_malloc_stats configurable by @nathanlo-hrt in #2658
  • feat(cmd, config): support REPLICAOF command and replicaof config option by @PragmaTwice in #2678
  • feat: skip block cache deallocation to make shutdown fast by @wanghenshui in #2683
  • feat(config): add the partition_filters option to disable the partitioned filters by @fukua95 in #2688

Improvements

Bug Fixes

  • fix: Better checking for prefix matches by @nathanlo-hrt in #2599
  • fix(command): wrong key range in commands: DISK/MEMORY/DUMP by @git-hulk in #2623
  • fix(cmd): add exclusive flag to FLUSHDB/FLUSHALL by @PragmaTwice in #2624
  • fix(script): avoid SetCurrentConnection on read-only scripting by @PragmaTwice in #2640
  • fix(cluster): should remove the master if it's not node in the cluster by @git-hulk in #2643
  • fix(bugfix): for txn_write_batch creation by @mapleFU in #2648
  • fix(log): fix rocksdb stall condition string output by @mapleFU in #2651
  • fix(cmd): args should be parsed before retrieving keys in COMMAND GETKEYS by @PragmaTwice in #2661
  • fix(stream): add KeyRangeGen for XRead and XReadGroup by @LindaSummer in #2657
  • fix(cmd): always print ok log when get full data file info failed by @sryanyuan in #2663
  • fix(replication): slave blocks until keepalive timer is reached when master is gone without fin/rst notification by @sryanyuan in #2662
  • fix(string): reset the value of expired key for incrby cmd by @FishYoung in #2667
  • fix(string): reset the value of expired key for SETRANGE cmd by @weim0000 in #2686
  • fix(cluster): should stop the migration if it's changed to the slave role by @RiversJin in #2716

Misc

Read more

2.10.1

24 Oct 15:10

Choose a tag to compare

This release addresses some critical bugs found in 2.10.0.

Bug Fixes

  • fix(stream): change XREADGROUP response for empty read response #2569 by @jonathanc-n
  • fix(stream): Fix XPENDING serialization issue #2566 by @nathanlo-hrt
  • fix(stream): fix XINFO group metadata key overlapping. #2576 by @LindaSummer
  • fix: some rocksdb properties are counted multiple times #2589 by @sryanyuan
  • fix: should remove the db lock from the context to prevent blocking user requests #2597 by @git-hulk
  • fix(json): JSON.MSET may update on the old json value #2579 by @poipoiPIO
  • fix(rocksdb): downgrade RocksDB to v9.3.1 due to a blobdb issue #2614 by @git-hulk

2.10.0

06 Oct 12:05

Choose a tag to compare

Important Notice

This new release introduces significant features, improvements, and fixes.

Dependency Updates: RocksDB version bumps from 8.11.4 to 9.6.1.

Highlights

The new data structure HyperLogLog and its commands are supported now, users can use PF* commands in Kvrocks. Thanks to contributors: @mapleFU @tutububug.

All stream group commands are supported in this release which makes Kvrocks totally compatible with Redis stream.

We allow to enhance the transaction consistency by introducing the db context. It will always use the same snapshot in the transaction while the configuration txn_context_enabled is enabled. Thanks to contributor: @PokIsemaine

Kvrocks Search commands and HNSW index are supported in Kvrocks, but we haven't released them because they're not ready for production at the moment.

New Features

  • feat(config): add compaction-checker-cron to extend original compaction-checker-range by @PragmaTwice in #2383
  • feat(search): Add HNSW encoding index & insertion/deletion algorithm by @Beihao-Zhou in #2368
  • feat(cluster): support migrate slot range by @PokIsemaine in #2389
  • feat(config): change redis-cursor-compatible default value to yes by @jihuayu in #2429
  • feat(json): add support of JSON.RESP command by @jackyyyyyssss in #2390
  • feat(search): support query parameters in SQL and RediSearch query by @PragmaTwice in #2443
  • feat(search): Hnsw Vector Search Plan Operator & Executor by @Beihao-Zhou in #2434
  • feat(config): allow to change the max length of the bulk string by @git-hulk in #2444
  • feat(config): implement integer config option with the unit by @PragmaTwice in #2448
  • feat(hyperloglog): add support of the Hyperloglog data structure by @tutububug in #2142
  • feat(search): implement vector query for sql/redisearch parser & transformer by @Beihao-Zhou in #2450
  • feat(hyperloglog): Add support of PFMERGE command by @mapleFU in #2457
  • feat(search): add support of HNSW vector fields for FT.CREATE by @Beihao-Zhou in #2477
  • feat(command): Implement the new command POLLUPDATES for polling updates by sequence by @git-hulk in #2472
  • feat(conn): add arguments for unknown command message by @PragmaTwice in #2483
  • feat(search): allow to omit ON HASH|JSON in FT.CREATE by @PragmaTwice in #2484
  • feat(script): Support script flags of Eval script and Function by @PokIsemaine in #2446
  • feat: Add slow flags for commands with heavy disk I/O by @jonathanc-n in #2494
  • refactor: Improve consistency and isolation semantics by adding Context parameter to DB API by @PokIsemaine in #2332
  • feat(config): add txn_context_enabled to allow to enable the transaction feature by @PokIsemaine in #2506
  • feat: support limit WriteBatch size by @AntiTopQuark in #2508
  • feat: Bitmap type DUMP/RESTORE command support by @poipoiPIO in #2535

Bug Fixes

  • fix(stream): NOGROUP/BUSYGROUP error message should return without 'ERR' prefix by @git-hulk in #2397
  • fix: Add timeouts to go-redis client and ping on client creation by @torwig in #2404
  • fix(search): misidentify DESC token in SQL parser by @PragmaTwice in #2439
  • fix: monitor dumps 0xffffff prefix for signed char by @PragmaTwice in #2482
  • fix(replication): potential deadlock when switching master frequently by @git-hulk in #2516
  • fix(namespace): didn't reload namespaces from DB after the full sync by @git-hulk in #2527
  • fix(replication): didn't resume the db status after restarting full sync by @git-hulk in #2549
  • fix(rdb): incorrect type conversion during RDB loads the int8 encoding by @fstd2 in #2547
  • fix: add more check in cluster node parsing by @jonathanc-n in #2538
  • fix(test): use fixed seed to improve reproducibility. by @LindaSummer in #2557
  • fix(config): wrong rocksdb config name max_sub_compactions by @ChrisZMF in #2499

Code Improvements

  • refactor: rename variable names for clarity in LCS method by @shoothzj in #2392
  • feat: add iter->status() check for loop iterators by @LindaSummer in #2395
  • perf(conn): skip index matching when index map is empty by @PragmaTwice in #2405
  • chore(resp): extract RESP functions from Connection by @PragmaTwice in #2406
  • refactor(stream): change the encoding of stream consumer group by @Yangsx-1 in #2384
  • chore: fix compiler warning in cluster and HNSW indexing by @jjz921024 in #2436
  • feat(stream): add support of XPENDING command by @Yangsx-1 in #2387
  • chore(hyperloglog): add go test cases and minor optimizations/bugfixes by @mapleFU in #2463
  • feat(search): Hnsw Vector Search Optimizaton Pass by @Beihao-Zhou in #2466
  • feat(command): add category enum for every command by @PragmaTwice in #2479
  • chore: use StringJoin in EnumField::Set by @PragmaTwice in #2485
  • chore: improve the style and document for SlotMigration by @mapleFU in #2465
  • fix(test): remove meaningless list-max-ziplist-size by @PokIsemaine in #2517
  • fix(typo): filed -> field by @AntiTopQuark in #2519
  • test: add go test cases for txn-context-enabled config by @PokIsemaine in #2530
  • chore(tests): add basic tests for the stream consumer group by @jonathanc-n in #2533
  • chore(tests): enhance the namespace replication to prevent flaky test by @git-hulk in #2540
  • chore(tests): refactor and enhance test cases to prevent flaky test failure by @git-hulk in #2544

Build & CI Changes

Read more