
Garnet 分布式缓存微软为什么用 .NET 从零重写整个缓存存储栈【免费下载链接】garnetGarnet 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.项目地址: https://gitcode.com/GitHub_Trending/garnet4/garnet缓存长期卡在两个瓶颈上单线程模型吃不满一台机器的 CPU线程间数据搬运又不断制造切换开销。微软研究院开源的 Garnet 分布式缓存重写了从网络收包到存储引擎的全链路——它说 RESP 协议你现有的 Redis 客户端一行代码不用改就能连上来。30 秒项目速览维度说明定位远程缓存存储cache-store主打高吞吐与低尾延迟出品方微软研究院Microsoft ResearchMIT 许可技术栈.NETC#存储引擎为自研 TsavoriteLinux/Windows 双平台协议RESPRedis 协议现有 Redis 客户端直接兼容适用人群想替换/补充缓存层、又不想改业务代码的开发者需要多分片集群与扩展点的高级用户它凭什么跑得快三个关键设计决策Garnet 的性能不是靠某个调参技巧而是把传统缓存服务器的三段流水线逐一换掉了。1. 共享内存网络层让 CPU 缓存替你搬运数据传统网络服务包括 Redis的常见做法是IO 线程收到包后把数据转交给工作线程处理——这一步既有线程切换开销也让数据离开了它原本所在的 CPU 缓存行。Garnet 借鉴 ShadowFax 研究用共享内存环形结构连接各线程让网络 IO 完成线程直接完成解析、TLS 处理乃至存储读写公共路径上零线程切换。数据留在原地被取走而不是被搬到正确的位置。2. 双存储引擎 统一日志字符串与复杂对象各走各的最优路径Garnet 的存储层由两个 Tsavorite KV 存储组成用一份统一的操作日志绑定主存储针对原始字符串GET/SET 这类优化精心管理内存以规避 GC 压力对象存储可选承载 List、Hash、Sorted Set 等复杂对象——内存中放托管堆对象更新快磁盘上存序列化形式。两者共享日志于是分层存储内存 → 本地 SSD → 云存储、非阻塞检查点、崩溃恢复这些数据库级能力就免费获得了。这意味着 Garnet 能装下比物理内存大的数据集而纯内存的竞品做不到。3. 窄腰存储 API上层再复杂底层只有四个动作整个 RESP 命令面读、更新、删除、原子读写各一类配异步回调都构建在极小的存储 API 之上。好处是因果清晰的解析/查询逻辑与存储细节并发、分层、检查点彻底解耦想加一个新命令或新数据类型只需在四个原语上组合不用碰并发模型。这也是 Garnet 能用 C# 直接写服务端存储过程、自定义数据类型并注册进协议的原因——扩展成本被压低到写个类的程度扩展框架见 website/docs/extensions/overview.md。网络与存储讲完了剩下就是这套设计落到真实业务里能解什么题。哪些场景用得上连接多、批量小的在线服务。典型痛点成千上万客户端各自发几条请求会话缓存、信息流、限流计数传统缓存在这种模式下吞吐扩展性掉得很快。Garnet 的共享内存设计正是为这个形状的工作负载优化的——官方基准测试Azure F72s v272 vCPU 机器对比 Redis 7.2 / KeyDB 6.3 / Dragonfly 6.2显示随客户端线程数增加Garnet 吞吐保持领先且扩展性更好键空间大到 2.56 亿键、远超 CPU 缓存时依然成立。测试方法可复现见 website/docs/benchmarking/results-resp-bench.md。想在服务端加自定义逻辑又不想再搭一个服务。传统方案里取键 条件判断 回写要拆成客户端多次往返或者外挂一个逻辑服务。Garnet 允许用 C# 注册自定义原始字符串操作、自定义对象类型和多键事务两阶段锁客户端照常走 RESP 协议调用Lua 脚本也支持。适合把少量关键业务逻辑从应用层下沉到缓存层的团队。数据装不下内存或想要一份带数据库能力的缓存。检查点、恢复、操作日志、多分片集群分片 复制 动态键迁移是原生能力而非外挂。另外有个反直觉的点Garnet 的预览功能 Vector Sets 用 DiskANN 实现了近似最近邻向量检索在 VectorDBBench 的 1000 万向量测试中 QPS 约为次优专项向量库的 2 倍、p99 搜索延迟压在 5ms 内官方数据功能尚在预览缓存与向量检索可以共用同一套存储栈。细节见 website/docs/commands/vector-sets.md。与 Redis 等开源缓存的差异点线程扩展模型不同Redis 主路径单线程吃满整机 CPU 靠多实例Garnet 单实例内部线程可伸缩一个共享内存实例即可占满整台机器的 CPU 与内存运维上一个节点少管好几份。兼容但不止步于兼容协议层与 Redis 客户端无缝但对象存储复用 .NET 生态实现数据类型存储扩展用 C# 而非 Lua 或 C 插件开发语言门槛不同。集群模式是被动的诚实的限定Garnet 集群不做 leader 选举而是响应你提供的控制平面下发的标准 Redis cluster 命令节点间靠 gossip 同步状态。适合已有调度/控制平面的平台团队裸跑集群场景需要自己补控制面。十分钟上手从 clone 到连上第一个客户端克隆仓库git clone https://gitcode.com/GitHub_Trending/garnet4/garnet安装 .NET 10 SDK 后在仓库根目录执行dotnet build -c Release进入main/GarnetServer执行dotnet run -c Release -f net10.0服务默认监听 TCP 6379 端口用任意 Redis 客户端如 C# 的 StackExchange.Redis即可连接--help可查看全部配置项官方文档入口website/docs/welcome/intro.md构建与部署指南Getting Startedwebsite/docs/getting-started/build.md版本发布说明Releaseswebsite/docs/welcome/releases.mdGarnet 用协议不换、栈全重写的思路证明了一件事缓存的性能上限取决于你愿意把多少底层假设拆掉重建。如果你正被高并发下的缓存吞吐或尾延迟卡住最快的验证方式就是按上面四步把它跑起来用你自己的负载压一轮。【免费下载链接】garnetGarnet 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.项目地址: https://gitcode.com/GitHub_Trending/garnet4/garnet创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考