# Garnet **Repository Path**: me860/garnet ## Basic Information - **Project Name**: Garnet - **Description**: Garnet实现了一系列API,包括原始字符串(例如,获取,设置和键过期),分析(例如,HyperLogLog和Bitmap)和对象(例如,排序集和列表) 操作。 - **Primary Language**: C# - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-03-26 - **Last Updated**: 2024-03-26 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Garnet [![.NET CI](https://github.com/microsoft/garnet/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/microsoft/garnet/actions/workflows/ci.yml) [![Discord Shield](https://discordapp.com/api/guilds/1213937452272582676/widget.png?style=shield)](https://aka.ms/garnet-discord) Garnet是微软研究院的新型远程缓存存储,提供了几个独特的优点: * Garnet采用了流行的 [RESP](https://redis.io/docs/reference/protocol-spec/) 线协议作为起点,使得可以从未修改的Redis客户端在大多数现代编程语言中使用Garnet,例如C#中的 [StackExchange.Redis](https://github.com/StackExchange/StackExchange.Redis)。 * 相比于可比的开源缓存存储,Garnet在许多客户端连接和小批量的情况下提供了更好的吞吐量和可扩展性,为大型应用和服务节省了成本。 * Garnet在使用加速TCP的商品云(Azure)VM的情况下展示了极低的客户端延迟(通常在99.9百分位数以下300微秒),这对于现实世界的场景至关重要。 * 基于最新的.NET技术,Garnet是跨平台的,可扩展的,现代的。它设计得易于开发和演变,而不牺牲常见情况下的性能。我们利用了.NET丰富的库生态系统来提供API广度,同时开放了优化的机会。由于我们对.NET的精心使用,Garnet在Linux和Windows上都实现了最先进的性能。 此仓库包含构建和运行Garnet的代码。更多信息和文档,请查看我们的网站 [https://microsoft.github.io/garnet](https://microsoft.github.io/garnet)。 ## 功能概述 Garnet实现了一系列API,包括原始字符串(例如,获取,设置和键过期),分析(例如,HyperLogLog和Bitmap)和对象(例如,排序集和列表) 操作。它可以处理以客户端侧RESP事务和我们自己的服务器侧存储过程的形式的多键事务,并允许用户在C#的便利和安全性中定义原始字符串和新对象类型的自定义 操作,从而降低了开发自定义扩展的门槛。 Garnet使用快速和可插拔的网络层,支持未来的扩展,如利用内核绕过堆栈。它支持使用 .NET的强大[SslStream](https://learn.microsoft.com/en-us/dotnet/api/system.net.security.sslstream)库的安全传输层安全(TLS)通信,以及基本的访问控制。Garnet的存储层,称为Tsavorite,是 从我们之前的开源项目[FASTER](https://github.com/microsoft/FASTER)分离出来的,并包括强大的数据库功能,如线程可扩展性,分层存储支持 (内存,SSD和云存储),快速非阻塞检查点,恢复,操作日志以实现持久性,多键事务支持,以及更好的内存管理和重用。 最后,Garnet支持集群模式操作,支持分片,复制和动态键迁移。

## 性能预览

我们在我们的[网站](https://microsoft.github.io/garnet/docs/benchmarking/overview)上展示了一些关键结果,将Garnet与领先的开源缓存存储进行比较。 ## 设计亮点 Garnet的设计重新思考了整个缓存存储栈 - 从网络上接收数据包,到解析和处理数据库操作,再到执行存储交互。我们基于我们多年的[先前研究](https://microsoft.github.io/FASTER/docs/td-research-papers/)。以下是Garnet的整体架构。

Garnet的网络层继承了我们之前对[ShadowFax](https://www.microsoft.com/en-us/research/publication/achieving-high-throughput-and-elasticity-in-a-larger-than-memory-store/)的研究启发的共享内存设计。TLS处理和存储交互在IO完成线程上执行,避免了常见情况下的线程切换开销。这种方法允许CPU缓存一致性将数据带到网络,而不是传统的基于洗牌的设计,这需要在服务器上移动数据。

Garnet的存储设计由两个Tsavorite键值存储组成,它们的命运由统一的操作日志绑定。第一个存储,称为“主存储”,针对原始字符串操作进行了优化,并仔细管理内存以避免垃圾收集。第二个,可选的,“对象存储”针对复杂对象和自定义数据类型进行了优化,包括流行的类型,如Sorted Set,Set,Hash,List和Geo。对象存储中的数据类型利用.NET库生态系统进行当前的实现。它们存储在内存中的堆上(这使得更新非常高效)和磁盘上的序列化形式。在未来,我们计划调查使用统一的索引和日志来简化维护。 Garnet的网络层继承了我们在[ShadowFax](https://www.microsoft.com/en-us/research/publication/achieving-high-throughput-and-elasticity-in-a-larger-than-memory-store/)上的先前研究所启发的共享内存设计。TLS处理和存储交互在IO完成线程上执行,避免了在常见情况下的线程切换开销。这种方法允许CPU缓存一致性将数据带到网络,而不是传统的基于洗牌的设计,这需要在服务器上移动数据。 Garnet设计的一个显著特点是其狭腰Tsavorite存储API,该API用于在顶部实现大型,丰富且可扩展的RESP API表面。此API由读取,插入,删除和原子读取-修改-写入操作组成,使用异步回调实现,以便Garnet在每个操作的各个点插入逻辑。我们的存储API模型使我们能够清楚地将Garnet的解析和查询处理问题与存储细节(如并发,存储分层和检查点)分开。Garnet使用两阶段锁定进行多键事务。 ### 集群模式 Garnet的存储设计由两个Tsavorite键值存储组成,它们的命运由统一的操作日志绑定。第一个存储,称为“主存储”,针对原始字符串操作进行了优化,并且仔细管理内存以避免垃圾收集。第二个,可选的,“对象存储”针对复杂对象和自定义数据类型进行了优化,包括流行的类型,如Sorted Set,Set,Hash,List和Geo。对象存储中的数据类型利用.NET库生态系统进行当前的实现。它们存储在内存中的堆上(这使得更新非常有效)和磁盘上的序列化形式。在未来,我们计划研究使用统一的索引和日志来简化维护。 除了单节点执行,Garnet还支持集群模式,该模式允许用户创建和管理一个分片和复制的部署。Garnet还支持一个高效且动态的键迁移方案来重新平衡分片。用户可以使用标准的Redis集群命令来创建和管理Garnet集群,节点执行八卦以共享和演变集群状态。集群仍在进行中。 ## 下一步 转到我们的[文档](https://microsoft.github.io/garnet)站点,或直接跳到[入门](https://microsoft.github.io/garnet/docs/getting-started)或[发布](https://microsoft.github.io/garnet/docs/welcome/releases)部分。 ## 许可 此项目根据[MIT许可](https://opensource.org/licenses/MIT)进行许可,查看[LICENSE](LICENSE)文件。 ## 隐私 隐私信息可以在[https://privacy.microsoft.com/en-us/](https://privacy.microsoft.com/en-us/privacystatement)找到。 ## 贡献 Garnet设计的一个显著特点是其狭腰Tsavorite存储API,该API用于在顶部实现大型,丰富且可扩展的RESP API表面。此API由读取,插入,删除和原子读取-修改-写入操作组成,使用异步回调实现,以便Garnet在每个操作的各个点插入逻辑。我们的存储API模型允许我们清晰地将Garnet的解析和查询处理问题与存储细节(如并发,存储分层和检查点)分开。Garnet使用两阶段锁定进行多键事务。 ### 集群模式 此项目欢迎贡献和建议。大多数贡献需要您同意贡献者许可协议(CLA),声明您有权并实际上授予我们使用您的贡献的权利。详情请访问https://cla.opensource.microsoft.com。 当您提交拉取请求时,CLA机器人将自动确定您是否需要提供CLA,并适当地装饰PR(例如,状态检查,评论)。只需按照机器人提供的指示操作。您只需要在所有使用我们CLA的仓库中做一次。 此项目已采用[Microsoft开源行为准则](https://opensource.microsoft.com/codeofconduct/)。 有关更多信息,请参见[行为准则常见问题解答](https://opensource.microsoft.com/codeofconduct/faq/)或联系[opencode@microsoft.com](mailto:opencode@microsoft.com)以获取任何其他问题或评论。 ## 商标 此项目可能包含项目,产品或服务的商标或徽标。Microsoft商标或徽标的授权使用必须遵循[Microsoft的商标和品牌指南](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general)。 除了单节点执行,Garnet还支持集群模式,该模式允许用户创建和管理一个分片和复制的部署。Garnet还支持一个高效且动态的键迁移方案来重新平衡分片。用户可以使用标准的Redis集群命令来创建和管理Garnet集群,节点执行八卦以共享和演变集群状态。集群仍在进行中。 ## 下一步 在此项目的修改版本中使用Microsoft商标或徽标不得引起混淆或暗示Microsoft赞助。 任何使用第三方商标或徽标都必须遵循那些第三方的政策。 前往我们的[文档](https://microsoft.github.io/garnet)站点,或直接跳到[入门](https://microsoft.github.io/garnet/docs/getting-started)或[发布](https://microsoft.github.io/garnet/docs/welcome/releases)部分。 ## 许可 Redis是Redis Ltd的注册商标。任何权利均保留给Redis Ltd。Microsoft的任何使用仅用于参考目的,不表示Redis和Microsoft之间的赞助,认可或隶属关系。