KiviDB 1.1.0 发布:兼容 Redis 的 Rust 数据库,吞吐量达 Redis 的 9 倍,并内置向量搜索
简要概述
KiviDB 1.1.0 是一个用 Rust 编写的 Redis/Valkey 直接替代品,它能利用所有 CPU 核心,在 32 核服务器上实现 2100 万次流水线 GET/s(约为 Redis 8 的 9 倍,Dragonfly 的 2.3 倍),并内置了类似 Redis Stack 的全文搜索和向量搜索功能。
什么是 KiviDB
KiviDB 是一个快速、多线程、内存键值存储系统,支持 Redis 协议(RESP2 和 RESP3)。它可以与任何现有的 Redis 客户端或 redis-cli 配合使用,无需更改代码,并增加了原生的 FT.* 命令,用于全文、标签、数值和 ANN 向量查询(FLAT 和 HNSW)。
- 协议兼容性 – 支持所有标准 Redis 命令;请参阅
COMMANDS.md获取支持的子集。 - 搜索集成 –
FT.CREATE、FT.SEARCH、FT.HYBRID等命令的行为与 Redis Stack 一致。 - 可选 Lua 和 TLS – 通过 Cargo 特性
lua和tls启用。 - 默认监听端口 – 6380(Redis 默认为 6379,因此两者可以并存)。
- 许可证 – 仅限 AGPL-3.0;将 KiviDB 作为网络服务使用不会对您的应用程序施加 AGPL 义务。
性能亮点
所有基准测试均于 2026 年 10 月在两台 AWS Graviton3 裸机 c7gn.metal 实例(64 vCPU,服务器使用 32 核)上运行。每个引擎均在隔离环境下进行测试。
键值吞吐量与延迟
| 操作 | KiviDB 1.1.0 | Dragonfly 2.0.2 | Redis 8.10 | Redis Cluster (32 分片) |
|---|---|---|---|---|
| GET, 流水线 ×16 | 21.2 M ops/s | 9.1 M | 2.4 M | 4.7 M |
| SET, 流水线 ×16 | 19.2 M ops/s | 8.5 M | 2.0 M | 4.7 M |
| GET, 无流水线 | 3.07 M ops/s | 3.35 M | 1.32 M | 1.46 M |
| SET, 无流水线 | 3.12 M ops/s | 3.38 M | 1.54 M | 1.46 M |
| p99 延迟 (GET/SET, 流水线 ×16) | 0.36 ms / 0.42 ms | 0.88 ms / 1.07 ms | 2.2 ms / 2.7 ms | – |
| 每个键的内存占用 | 177 B | 134 B | 178 B | 183 B |
KiviDB 的分片式、每核心设计使每个核心都能处理请求,这与 Redis 的单线程 I/O 模型不同。
向量搜索 (ANN) 性能
基准测试使用了 redis/vector-db-benchmark 套件,基于 118 万个向量、25 维的 Glove 数据集(HNSW, M=16, EF_CONSTRUCTION=256)。100 个客户端线程上传 64 个向量的批次,然后在不同的 ef 值下发出查询。
| 指标 | KiviDB 1.1.0 | Dragonfly 2.0.2 | Redis 8.10 (查询引擎) |
|---|---|---|---|
| 查询/秒 (ef = 64, recall@10) | 59.3 k (0.943) | 41.3 k (0.912) | 31.8 k (0.912) |
| 查询/秒 (ef = 128) | 50.7 k (0.961) | 40.3 k (0.937) | 28.9 k (0.937) |
| 查询/秒 (ef = 256) | 31.5 k (0.989) | 36.2 k (0.979) | 21.1 k (0.979) |
| 查询/秒 (ef = 512) | 18.7 k (0.998) | 29.8 k (0.995) | 13.7 k (0.995) |
| 摄入与索引构建时间 | 31 s | 13 s | 38 s |
| 摄入后内存占用 | 1.66 GB | 1.13 GB | 1.07 GB |
KiviDB 在较低
ef值的高召回率查询中表现出色,而 Dragonfly 构建索引的速度更快且内存占用更少。
核心架构优势
- 每核心分片设计 – 每个工作线程拥有一个不相交的键空间切片,消除了锁竞争并实现了真正的并行处理。
- Rust 安全性与性能 – 使用 2024 版本编译,在可用时利用
io_uring(回退到 Tokio)。 - 内置搜索 – 无需外部模块;
FT.*命令是核心二进制文件的一部分。 - 持久化选项 – 快照 (
dump.kdb) 和可选的追加写入文件 (AOF),实现近乎实时的持久性。
快速入门指南
# 拉取官方 Docker 镜像 (默认版本)
docker run -d -p 6380:6380 kividb/kividb
# 验证服务器是否存活
redis-cli -p 6380 PING # → PONG
创建向量索引 (Redis-Stack 语法)
redis-cli -p 6380 FT.CREATE idx ON HASH PREFIX 1 doc: \
SCHEMA vec VECTOR HNSW 10 TYPE FLOAT32 DIM 128 \
DISTANCE_METRIC COSINE M 16 EF_CONSTRUCTION 128
存储向量
在哈希字段中存储原始小端序 FLOAT32 字节(例如 HSET doc:1 vec <binary>)。该格式与 Redis Stack 和 redis-py/NumPy 二进制数据兼容。
KNN 查询 (Dialect 2)
redis-cli -p 6380 FT.SEARCH idx '*=>[KNN 10 @vec $q]' \
PARAMS 2 q <binary-blob> DIALECT 2
完整的命令参考请见 COMMANDS.md。
持久化详情
- 快照 (
dump.kdb) 在索引后执行SAVE/BGSAVE时捕获键、索引模式和 HNSW 图。 - AOF (
--aof) 追加每次写入;重启时会重放 AOF 并成为事实来源,跳过快照加载。 - 在启动时的索引重建期间,大多数命令会返回
LOADING,直到图准备就绪;PING和INFO保持可用。
构建版本
| 版本 | Cargo 特性 | 增加的功能 |
|---|---|---|
default |
无 | 仅核心服务器 |
lua |
lua |
Lua 脚本 (EVAL, SCRIPT, …) |
tls |
tls |
TLS 监听器和节点间 TLS |
full |
lua,tls |
同时包含 Lua 和 TLS |
示例构建:
cargo build --release # 默认
cargo build --release --features lua # 带 Lua
cargo build --release --features tls # 带 TLS
cargo build --release --features lua,tls # 全功能
Linux 构建在内核允许时会自动使用 io_uring;否则回退到 Tokio (--io-model auto)。
配置亮点
关键标志(括号内为默认值):
--port 6380– 监听端口。--bind 0.0.0.0– 地址;设置此项将禁用保护模式。--protected-mode yes– 默认开启;除非配置了密码或绑定地址,否则仅允许回环客户端。--threads 0– 自动选择核心数-2(最小为 2)。--aof– 启用追加写入文件持久化。--maxmemory 0– 无限制内存;设置此项以强制执行上限。--cluster-enabled no– 可选的集群模式,在port+10000上有单独的总线。- TLS 选项(
--tls-port、--tls-cert-file等)在构建时启用tls特性后可用。
所有标志均可通过 Redis 风格的配置文件(默认 /etc/kividb/kividb.conf)或命令行提供;命令行值会覆盖文件值。
Docker 使用
# 拉取最新镜像 (默认版本)
docker pull kividb/kividb:latest
docker run -p 6380:6380 kividb/kividb
- 容器默认以
--protected-mode no运行,因为 Docker 会将网络暴露在外部。请传递您自己的标志以重新启用保护模式并设置密码。 - 对于 AOF 持久化:
docker run -p 6380:6380 \
-v $(pwd)/data:/home/kividb \
ghcr.io/kividbio/kividb \
--aof --requirepass "change-me"
- 要在 Docker 内允许
io_uring,请添加--security-opt seccomp=unconfined(在生产环境使用前请了解安全影响)。
社区反馈 (Hacker News)
- 基准测试可复现性 – 作者分享了
kivi-benchmark仓库,其中包含用于独立验证的 Terraform 脚本和负载生成器代码。(评论者 @murtazayusuf) - 负载生成器限制 – 有评论者指出,实现 >500 万次操作/秒通常需要多个负载生成器主机;KiviDB 报告的 2100 万次操作/秒可能反映了服务器的容量,而非客户端瓶颈。(评论者 @falconBrisk47)
- 功能比较请求 – 用户询问了 Valkey 基准测试以及与 Apache KVrocks 的比较;这些内容未出现在当前的发行说明中。
- AI 参与 – 维护者确认在设计决策中大量使用了 AI 辅助,但核心工程是由人工驱动的。(评论者 @ghm2180)
- 内存占用 – 关于摄入期间内存使用的问题尚未得到解答;已发布的表格显示了每个键的内存 (177 B) 和摄入后的向量内存 (118 万个向量占用 1.66 GB)。
许可与商业选项
KiviDB 采用 AGPL-3.0-only 许可发布。将未修改的 KiviDB 作为网络服务运行不会对您的专有应用程序施加 AGPL 义务。如果您修改了 KiviDB 本身并将其作为托管服务提供,则必须向用户提供修改后的源代码。
对于无法接受 AGPL 条款的组织,KIVIDB PRIVATE LIMITED 提供商业许可。咨询请发送至 support@kividb.io。
获取方式
- GitHub 仓库 – https://github.com/kividbio/kividb
- Docker Hub / GHCR –
kividb/kividb:latest(也提供v1.1.0,v1.1.0-lua,v1.1.0-tls,v1.1.0-full) - 发行版二进制文件 – Linux x86_64, Linux aarch64, macOS (Intel & Apple Silicon) 压缩包;也提供 Debian/RPM 包。
- 基准测试套件 – https://github.com/kividbio/kivi-benchmark 用于复现性能数据。
快速参考命令
# 启动服务器 (默认版本)
./kividb
# 使用 TLS 启动 (需要 `tls` 特性)
./kividb --port 6380 --tls-port 6381 \
--tls-cert-file cert.pem --tls-key-file key.pem
# 启用 AOF 持久化
./kividb --aof --requirepass "s3cr3t"
# 以集群模式运行
./kividb --cluster-enabled yes --cluster-node-timeout 15000
所有基准测试数据均为单一受控环境的快照;实际性能将根据硬件、工作负载和配置而有所不同。