公告

介绍 HotKV

我为什么打造 HotKV,一款用现代 C++ 从零编写、兼容 Redis 的多线程数据存储,以及它的由来、目前提供的功能和基准测试结果。

介绍 HotKV:火力全开的键值存储。

HotKV 是一款用现代 C++ 从零编写、兼容 Redis 的多线程数据存储,旨在以尽可能低的成本,在现代多核服务器上发挥出最高的速度。我是 Norbert E. Boros,HotKV Ltd 的创始人兼 CEO。本文介绍我为什么打造它、它目前能做什么,以及它的实测表现。

简而言之:HotKV 在单个进程内同时使用多个线程执行命令,并支持 Redis 协议 RESP2 和 RESP3。在我们 2026 年 10 月于 160 个 vCPU 上进行的单实例基准测试中,它在所测的 12 条命令中的 11 条上吞吐量最高,在第十二条命令上 Dragonfly 与它持平。测试设置及其局限见下文。

我为什么打造 HotKV

我在打造任何东西时都很在意速度。一个网站、一个工具或一台服务器都应该即时响应。如果没有做到,我就想知道原因。从我开始编写软件起,这个习惯就一直影响着我的工作。

多年来,C 和 C++ 一直是我的主要语言。近十年里,我从事游戏反作弊软件的开发,这款软件运行在数千名玩家的电脑上。它必须在扫描内存查找作弊程序的同时,尽可能少地占用 CPU 和内存,因为它消耗的每一个周期都是从游戏那里拿走的。这段工作教会了我测量一切、围绕硬件进行设计,并把低资源占用本身视为一项功能。

与此同时,我在许多需要快速缓存的项目中使用了 Redis 和 Valkey,包括会话存储、被防火墙封禁的 IP 地址列表,以及位于数亿条 SQL Server 记录前面的缓存。它们都是出色的工具。它们也让我好奇,如果一个键值存储从一开始就是为我们今天使用的多核服务器而设计的,它能做到什么。

HotKV 就是我找到的答案。我用现代 C++ 从零编写了它,以尽可能低的成本从硬件中获得尽可能高的速度。下文的基准测试展示了它目前的水平,我预计还有更多提升空间。

AI 的成本

还有第二个原因。运行 AI 应用正变得越来越昂贵,对我来说是这样,从开发者在网上分享的情况来看,对许多其他人也是如此。这笔成本中很大一部分往往来自向模型发送它已经回答过的问题。一个能够识别重复或相似的问题、并直接从缓存中作答的快速存储,是削减这笔开支最直接的方法之一。正因如此,面向 AI 工作负载的缓存是 HotKV 的核心组成部分。

HotKV 的目标

HotKV Ltd 的成立,就是为了让这类软件性能更高、价格更实惠。现代服务器拥有大量核心,数据存储理应把它们用起来,让您以尽可能低的成本获得尽可能高的速度。

第二个想法是把技术栈中更多的部分集中到一处。基于 LLM 构建应用的团队往往最终要同时运行一个缓存、一个向量数据库,以及某个存放智能体记忆的地方,彼此之间还夹着一大堆胶水代码。我希望缓存以及围绕它展开的 AI 工作都运行在同一个引擎中,紧挨着您的数据:模型调用的精确缓存和语义缓存、向量搜索、智能体记忆和 Token 预算。要运行的系统更少,应当意味着更少的活动部件和更低的账单。AI 页面列出了目前可用的功能,Token 节省基准测试展示了在我们的测试中缓存模型调用节省了多少。

HotKV 保留了 Redis 协议和熟悉的客户端库。

问题所在

在多核机器上,单个命令执行线程可能成为瓶颈。围绕单个执行线程构建的数据存储,通常要靠运行多个实例或一个集群才能用上机器的其余部分,这也带来了部署上的选择和运维工作。我希望 HotKV 从另一端出发,让命令在单个实例内并发执行,从而让一个进程就能用满整台机器。

HotKV 的不同之处

HotKV™ 使用 C++20 编写,设计上可同时在多个核心上执行命令,因此单个实例就能用上整台机器。我们在下文中进行基准测试的 Dragonfly 同样采用多线程方案。

  • 多核心,单实例:命令在机器的各个核心上并发执行,因此一个实例就能用好一台大型服务器,而无需多台较小的服务器。
  • 熟悉的客户端和协议:HotKV 支持 RESP2 和 RESP3,因此熟悉的客户端库都能连接到它。支持事务(MULTI/EXEC)和 Lua 脚本。所支持的命令及任何差异请参阅命令文档。

开发与测试方式

HotKV 由我亲自开发,并在有帮助的地方借助 AI。比一行代码是怎么写出来的更重要的,是它能否经得住考验,因此引擎经过了严格的测试。它拥有 2,000 多个自动化测试,并可在 AddressSanitizer、ThreadSanitizer 和 UndefinedBehaviorSanitizer 下构建。它还为协议解析器、命令分发、RDB 和 AOF 加载、复制流以及集群总线提供了模糊测试目标。

基准测试的设置、局限和完整结果都在性能页面上,您可以自行判断这些数字。

基准测试速览

2026 年 10 月更新:本文最初发布的数据来自我们后来发现存在缺陷的基准测试运行(其中一个问题是每个负载生成器都使用了相同的随机种子),因此我们已将其替换为重建后的基准测试的结果。

2026 年 10 月:HotKV、Redis、Valkey 和 Dragonfly

本次基准测试由 HotKV Ltd 进行。我们将从源代码编译的 HotKV 与 Redis 8.10.2、Valkey 9.1.2 和 Dragonfly 2.0.2 进行了对比。每个服务器单独运行,以单实例方式使用一台 Azure D160alds_v7(AMD EPYC 9V45)的全部 160 个 vCPU,并关闭持久化。三台独立的 64 vCPU 机器使用 memtier_benchmark 生成负载:值大小为 256 字节,管道深度为 30,预先写入 5,000,000 个键。每个数字都是三次 10 秒运行的中位数。

HotKV 在 12 条命令中的 11 条上吞吐量最高。与 Redis 或 Valkey 相比,视命令和服务器而定,它的实测吞吐量是对方的 8.6 倍到至少 69.7 倍;与 Dragonfly 相比,在这 11 条命令上是对方的 1.97 倍到 4.41 倍,其中有几项是下限。在 PING 上,Dragonfly 的实测结果领先 0.6%。我们将其视为打平,因为负载生成器已接近其自身的上限。数据命令中的最高值是每秒 9,080 万次 INCR 操作。INCR 和 PING 传输的数据很少,受限于负载生成器,因此 HotKV 自身在这两条命令上能达到的数字可能更高。

命令HotKV(百万 ops/s)HotKV 对比 RedisHotKV 对比 ValkeyHotKV 对比 Dragonfly
SET50.5≥ 14.80x≥ 17.51x≥ 3.36x
GET36.6≥ 32.34x≥ 22.46x≥ 2.73x
MGET4.616.61x8.60x1.97x
SETNX55.3≥ 39.58x≥ 29.73x≥ 3.83x
APPEND25.116.37x19.41x2.83x
INCR90.843.15x47.33x4.41x
LPUSH31.625.34x37.55x2.99x
RPUSH43.8≥ 69.67x≥ 49.83x≥ 3.97x
SADD50.6≥ 24.65x≥ 56.60x≥ 4.20x
HSET29.0≥ 54.05x≥ 37.09x≥ 2.96x
MSET11.3≥ 29.78x≥ 24.26x≥ 3.83x
PING125.2≥ 38.70x≥ 35.98x0.99x (持平)

如何阅读此表

MGET 每条命令读取八个键,MSET 每条命令写入四个键值对,吞吐量按命令计数。报告标记了 HotKV 的七个数字(GET 和六条写入命令),因为它们达到了报告中 85% 的网络使用率阈值;PING 也被标记,因为负载生成器的 CPU 占用超过了 85%。基于这些数字计算的比值都是下限,以 ≥ 标示。GET 和 PING 确实触及了上限。对于这六条写入命令,报告中的网络使用率把入站和出站流量相加,再与出站上限比较,因此高估了它们接近上限的程度。流量最大的 SETNX 最多只用到了实测入站上限的约 80%。我们仍按保守惯例为它们保留 ≥ 标记。完整表格、标记和方法说明见性能页面。

基准测试的范围

  • 构建与调优:HotKV 使用 -march=native 针对测试 CPU 编译,而其他服务器使用的是官方发布的标准构建。
  • 线程设置:每个服务器都分配了机器的全部核心,即 HotKV 为 --threads 160,Dragonfly 为 160 个 proactor 线程,Valkey 为 io-threads 160,Redis 为 io-threads 128(其上限)。Redis 和 Valkey 在一个线程上执行命令,使用较少的 I/O 线程时可能达到更高的吞吐量,因此它们的数字可能低于其最佳水平。我们没有为它们运行集群或多个实例。
  • 范围:12 条命令、一种值大小、一种管道深度,不使用 TLS,也不开启持久化。LPOP 和 RPOP 未被测量,因为在这样的速率下,破坏性读取会在 10 秒内清空任何能装入内存的列表。报告记录了延迟和内存使用,但我们在此不作比较,因为各服务器在每次 10 秒运行中完成的工作量差异很大,内存数据并不具备可比性。混合工作负载未被测量。
  • 波动:Redis 在若干命令上的三次运行之间波动很大,在 HSET 上最快与最慢一次运行相差可达 7.2 倍,而中位数掩盖了这一点。如果改为与每个竞争对手最快的一次运行而非中位数相比,HotKV 仍在全部 11 条命令上领先。

Redis、Valkey 和 Dragonfly 是其各自所有者的商标。提及这些名称仅为标明我们所测量的软件,并不意味着任何赞助、认可或从属关系。

目前提供的功能

核心命令族包括字符串、列表、集合、哈希、有序集合、流、地理空间索引、位图、HyperLogLog、发布/订阅和 Lua 脚本。AI 模块和企业功能在授权套餐中运行。价格页面列出了每个套餐包含的内容。当前的命令覆盖情况请参阅文档。在 Redis 命令集之外,还有:

  • 键标签:为键添加任意标签并按标签查询(TAG.SET、TAG.MEMBERS 以及另外五条命令)。
  • 纳秒级 TTL:NEXPIRE、NTTL 和 NEXPIREAT 以纳秒为单位设置和读取过期时间,因此截止时间可以精细到毫秒以下。过期的键由后台清理回收,也会在被访问时回收。
  • 可选的值压缩:适用于超过大小阈值(默认 512 字节)的值,除非您主动开启,否则保持关闭。
  • 无 fork 快照:BGSAVE 在后台线程而不是 fork 出的进程中写入。快照并不是某一时间点的副本,每个键按快照处理到它时的状态保存。重写仅追加文件时则会 fork。
  • Prometheus 指标:内置的 HTTP 端点,默认关闭,通过 metrics-port 开启,因此无需外部导出器。

HotKV 还内置了基于 HNSW 索引的向量搜索(VSIM.CREATEINDEX、VSIM.SET、VSIM.SEARCH)。我们在向量搜索:HotKV 对比 Redis 8 向量集合,从 1 到 100 个客户端一文中将它与 Redis 8 进行了对比测试。

在 HotKV Cloud 上开始使用,或联系销售,咨询在您自己的服务器上运行 HotKV。

觉得有用?

分享这篇文章

继续讨论

评论

对方法有疑问?在您的硬件上得到了不同的结果?欢迎分享您的发现。评论经审核后才会显示。

发表评论

您的显示名称和评论在审核通过后会公开。您的电子邮件地址仅用于上述通知,绝不会显示。您开始输入后,Cloudflare Turnstile 会进行反垃圾检查。 隐私详情.