garnet:基于 .NET 技术的远程缓存存储项目

Garnet is a remote cache-store from Microsoft Research that offers strong performance (throughput and latency), scalability, storage, recovery, cluster sharding, key migration, and replication features. Garnet can work with existing Redis clients.

分支134Tags135
文件最后提交记录最后更新时间
19 天前
18 天前
18 天前
2 个月前
4 个月前
13 天前
3 个月前
4 个月前
1 个月前
1 个月前
4 个月前
17 天前
13 天前
2 年前
4 个月前
1 个月前
4 个月前
2 年前
7 个月前
1 个月前
3 个月前
3 个月前
1 个月前
3 个月前
6 个月前
3 个月前
27 天前
2 年前
2 年前
1 年前
1 个月前
2 年前
2 年前
12 天前
2 年前
5 个月前
1 个月前

Garnet

.NET CI BDN Charts Discord Shield

Garnet 是一款远程缓存存储,具有多项独特优势:

  • Garnet 采用广受欢迎的 RESP 有线协议作为起点,这使得 Garnet 能够直接使用当今大多数编程语言中现成的 Redis 客户端,例如 C# 中的 StackExchange.Redis
  • 相比同类开源缓存存储,Garnet 在处理大量客户端连接和小批量数据时,展现出更卓越的吞吐量和可扩展性,能为大型应用和服务节省成本。
  • 在启用了加速网络的通用云(Azure)虚拟机上,Garnet 可实现极低的客户端延迟(99.9% 分位通常低于 300 微秒),这对实际业务场景至关重要。
  • Garnet 基于最新的 .NET 技术构建,具备跨平台、可扩展和现代化的特性。其设计旨在便于开发和迭代,同时不影响常见场景下的性能。我们借助 .NET 丰富的库生态系统来拓展 API 广度,并为优化预留了开放空间。通过对 .NET 的精心运用,Garnet 在 Linux 和 Windows 平台上均实现了业界领先的性能。

本代码库包含构建和运行 Garnet 的代码。如需更多信息和文档,请访问我们的网站:https://microsoft.github.io/garnet

正在寻找完全托管的服务? Azure Cosmos DB Garnet Cache 提供 Garnet 作为完全托管、企业级的缓存解决方案,内置高可用性、性能保障和零基础设施管理。

新特性一览 🎉

  • 🚀 向量集合(预览版) — 基于 DiskANN 算法和 Garnet 的 Tsavorite 存储引擎,提供近似最近邻搜索功能。在我们的 初步结果 中,Garnet 在每秒查询数(QPS)、p99 延迟和召回率方面均处于领先地位。
  • 🔍 范围索引(预览版) — 借助 Bf-Tree 技术,为 Garnet 键提供二级范围索引和等值索引。
  • 📄 Garnet 论文将在 VLDB 2026 会议上发表! B. Chandramouli, V. Zois, T. Hart, T. Zaccai, L. M. Maas, Y. Rajasekaran, D. Gehring. Garnet: A Next-Generation Cache-Store for Accelerating Applications and Services. PVLDB 2026. [PDF]

功能概述

Garnet 实现了广泛的 API,包括原始字符串操作(如 gets、sets 和键过期)、分析型操作(如 HyperLogLog 和 Bitmap)以及对象型操作(如有序集合和列表)。它能够处理多键事务,支持客户端 RESP 事务以及我们自研的 C# 服务器端存储过程和模块。用户可以在 C# 环境中,以便捷且安全的方式,为原始字符串和自定义对象类型定义自定义操作,从而降低了开发自定义扩展的门槛。Garnet 同时支持 Lua 脚本。

Garnet 采用快速且可插拔的网络层,为未来扩展(如利用内核绕过栈)奠定了基础。它使用 .NET 强大的 SslStream 库支持安全的传输层安全(TLS)通信,并提供基本的访问控制功能。Garnet 的存储层名为 Tsavorite,专为高性能而构建,具备强大的数据库特性,例如线程可扩展性、分层存储支持(内存、SSD 和云存储)、快速无阻塞检查点、恢复机制、用于持久性的操作日志、多键事务支持以及更优的内存管理与复用。最后,Garnet 支持集群模式运行,具备分片、复制和动态键迁移功能。

性能预览

我们在官方网站上展示了一些关键结果,将 Garnet 与主流开源缓存存储进行了对比。

设计亮点

Garnet 的设计对整个缓存存储栈进行了重新思考——从网络上接收数据包,到解析和处理数据库操作,再到执行存储交互。我们的设计建立在多年先前研究的基础之上。以下是 Garnet 的整体架构。

Garnet 的网络层基于共享内存设计,TLS 处理和存储交互在网络 IO 完成线程上执行,避免了常见情况下的线程切换开销。这种方法利用 CPU 缓存一致性将数据传输到处理逻辑,而非传统的基于 shuffle 的网络设计,后者需要将数据移动到服务器上的相应分片。

Garnet 的存储设计包含两个 Tsavorite 键值存储,它们的命运由一个统一的操作日志绑定。第一个存储称为“主存储”,针对原始字符串操作进行了优化,并对内存进行精心管理以避免垃圾回收。第二个(可选的)“对象存储”针对复杂对象和自定义数据类型进行了优化,包括 Sorted Set、Set、Hash、List 和 Geo 等常用类型。对象存储中的数据类型在当前实现中利用了 .NET 库生态系统。它们在内存中以堆的形式存储(这使得更新非常高效),并在磁盘上以序列化形式存储。未来,我们计划研究使用统一的索引和日志以简化维护。

Garnet 设计的一个显著特点是其窄腰型 Tsavorite 存储 API,该 API 用于在其之上实现庞大、丰富且可扩展的 RESP API 表面。此 API 包括读取、更新插入、删除和原子性读写操作,并通过异步回调实现,使 Garnet 能够在每个操作的各个阶段插入逻辑。我们的存储 API 模型使我们能够将 Garnet 的解析和查询处理关注点与并发、存储分层和 checkpointing 等存储细节清晰地分离。Garnet 对多键事务使用两阶段锁定。

集群模式

除了单节点运行外,Garnet 还具备功能完备的集群模式,支持用户创建和管理分片与复制部署。Garnet 同样支持高效且动态的键迁移方案,用于重新平衡分片。用户可使用标准的 Redis 集群命令来创建和管理 Garnet 集群,节点通过 gossip 协议共享和更新集群状态。Garnet 的集群模式设计目前为被动式:这意味着它不实现领导者选举,仅响应用户提供的控制平面所发出的集群命令;详情请参见此链接

后续步骤

请访问我们的文档网站,或直接跳至快速入门版本发布部分。

许可证

本项目采用 MIT 许可证,详见 LICENSE 文件。

隐私

隐私信息请参见 https://privacy.microsoft.com/en-us/

贡献

本项目欢迎各类贡献和建议。大多数贡献要求您同意《贡献者许可协议》(CLA),以声明您有权并实际授予我们使用您贡献的权利。详情请访问 https://cla.opensource.microsoft.com

当您提交拉取请求时,CLA 机器人将自动判断您是否需要提供 CLA,并对 PR 进行相应标记(例如状态检查、评论)。您只需按照机器人提供的指示操作即可。在所有使用我们 CLA 的仓库中,您只需完成一次此操作。

本项目已采用 Microsoft 开源行为准则。如需了解更多信息,请参见行为准则常见问题,或通过 opencode@microsoft.com 联系我们以获取其他问题或意见的解答。

商标

本项目可能包含相关项目、产品或服务的商标或徽标。Microsoft 商标或徽标的授权使用受 Microsoft 商标与品牌指南 约束,且必须遵循该指南。

在本项目的修改版本中使用 Microsoft 商标或徽标时,不得造成混淆,也不得暗示 Microsoft 的赞助。

任何第三方商标或徽标的使用均受该第三方政策的约束。

Redis 是 Redis Ltd. 的注册商标。其所有权利归 Redis Ltd. 所有。Microsoft 对 Redis 的任何使用仅为参考目的,并不表示 Redis 与 Microsoft 之间存在任何赞助、背书或关联关系。

项目介绍

Garnet is a remote cache-store from Microsoft Research that offers strong performance (throughput and latency), scalability, storage, recovery, cluster sharding, key migration, and replication features. Garnet can work with existing Redis clients.

定制我的领域
7712.02 K699访问 GitHub