Garnet 是 Microsoft Research 的远程缓存存储,提供强大的性能(吞吐量和延迟)、可扩展性、存储、恢复、集群分片、密钥迁移和复制功能。

Garnet 可以与现有的 Redis 客户端配合使用。

Garnet 是 Microsoft Research 推出的一种新型远程缓存存储,具有多种独特优势:

  • Garnet 采用流行的 RESP 线路协议作为起点,这使得可以从当今大多数编程语言(例如 C# 中的 StackExchange.Redis)中可用的未经修改的 Redis 客户端使用 Garnet。
  • 相对于同类开源缓存存储,Garnet 通过许多客户端连接和小批量提供更好的吞吐量和可扩展性,从而节省大型应用程序和服务的成本。
  • Garnet 使用启用了加速 TCP 的商品云 (Azure) VM 展示了极低的客户端延迟(在 99.9% 时通常低于 300 微秒),这对于现实场景至关重要。
  • Garnet 基于最新的 .NET 技术,具有跨平台、可扩展和现代化的特点。它被设计为易于开发和发展,而不会牺牲常见情况下的性能。我们利用 .NET 丰富的库生态系统来扩展 API,并提供开放的优化机会。由于我们对 .NET 的精心使用,Garnet 在 Linux 和 Windows 上都实现了最先进的性能。

该存储库包含构建和运行 Garnet 的代码。有关更多信息和文档,请访问网站:https://microsoft.github.io/garnet。

特性总结

Garnet 实现了广泛的 API,包括原始字符串(例如,获取、设置和密钥过期)、分析(例如,HyperLogLog 和 Bitmap)和对象(例如,排序集和列表)操作。它可以以客户端 RESP 事务和我们自己的 C# 服务器端存储过程的形式处理多密钥事务,并允许用户在原始字符串和新对象类型上定义自定义操作,所有这些都以 C# 的便利性和安全性实现,导致开发自定义扩展的门槛较低。

Garnet 使用快速且可插拔的网络层,支持未来的扩展,例如利用内核旁路堆栈。它使用强大的 .NET SslStream 库支持安全传输层安全 (TLS) 通信以及基本访问控制。 Garnet 的存储层称为 Tsavorite,是从我们之前的开源项目 FASTER 中分叉出来的,包括强大的数据库功能,例如线程可扩展性、分层存储支持(内存、SSD 和云存储)、快速非阻塞检查点、恢复、操作日志记录以实现持久性、多键事务支持以及更好的内存管理和重用。最后,Garnet 支持集群操作模式,支持分片、复制和动态密钥迁移。

性能预览

我们在网站上展示了一些关键结果,将 Garnet 与领先的开源缓存存储进行比较。

设计亮点

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

Garnet 的网络层继承了受我们之前对 ShadowFax 研究启发的共享内存设计。 TLS 处理和存储交互在 IO 完成线程上执行,避免了常见情况下的线程切换开销。这种方法允许 CPU 缓存一致性将数据传输到网络,而不是传统的基于随机播放的设计,后者需要在服务器上移动数据。

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

Garnet 设计的一个显着特点是其窄腰 Tsavorite 存储 API,用于在顶部实现大型、丰富且可扩展的 RESP API 表面。该 API 包含读取、更新插入、删除和原子读取-修改-写入操作,通过 Garnet 的异步回调实现,以便在每个操作期间的各个点插入逻辑。存储 API 模型使我们能够将 Garnet 的解析和查询处理问题与并发、存储分层和检查点等存储细节完全分开。 Garnet 对多密钥交易使用两阶段锁定。

集群模式

除了单节点执行之外,Garnet还支持集群模式,允许用户创建和管理分片和复制部署。 Garnet 还支持高效、动态的密钥迁移方案来重新平衡分片。用户可以使用标准的Redis集群命令来创建和管理Garnet集群,节点执行gossip来共享和演化集群状态。集群工作仍在进行中。

License

该项目已获得 MIT 许可证的许可,请参阅许可证文件。

隐私

隐私信息可在 https://privacy.microsoft.com/en-us/ 找到。

贡献

该项目欢迎贡献和建议。大多数贡献都要求您同意贡献者许可协议 (CLA),声明您有权并且实际上授予我们使用您的贡献的权利。有关详细信息,请访问 https://cla.opensource.microsoft.com。

当您提交拉取请求时,CLA 机器人将自动确定您是否需要提供 CLA 并适当地修饰 PR(例如状态检查、评论)。只需按照机器人提供的说明进行操作即可。您只需使用我们的 CLA 在所有存储库中执行一次此操作。

该项目采用了微软开源行为准则。有关详细信息,请参阅行为准则常见问题解答或联系 opencode@microsoft.com 提出任何其他问题或意见。

商标

该项目可能包含项目、产品或服务的商标或徽标。 Microsoft 商标或徽标的授权使用须遵守且必须遵循 Microsoft 的商标和品牌指南。在此项目的修改版本中使用 Microsoft 商标或徽标不得引起混淆或暗示 Microsoft 赞助。对第三方商标或徽标的任何使用均须遵守这些第三方的政策。

Redis 是 Redis Ltd 的注册商标。其中的任何权利均归 Redis Ltd 保留。Microsoft 的任何使用仅供参考,并不表明 Redis 与 Microsoft 之间有任何赞助、认可或从属关系。

github地址: https://github.com/microsoft/garnet

Garnet发布 Redis不再是唯一选择的更多相关文章

  1. 【1w字+干货】第一篇,基础:让你的 Redis 不再只是安装吃灰到卸载(Linux环境)

    Redis 基础以及进阶的两篇已经全部更新好了,为了字数限制以及阅读方便,分成两篇发布. 本篇主要内容为:NoSQL 引入 Redis ,以及在 Linux7 环境下的安装,配置,以及总结了非常详细的 ...

  2. jQuery 2.0发布,不再支持IE6/7/8

    有时发现jQuery库引用的都对,javascript代码写的也没问题,可是jquery就是出现问题,额--我发现换个jquery库就没问题了,长时间不关注jquery的问题而已: 很多人都没有使用最 ...

  3. 阿里云发布 Redis 5.0 缓存服务:全新 Stream 数据类型带来不一样缓存体验

    4月24日,阿里云正式宣布推出全新 Redis 5.0 版本云数据库缓存服务,据悉该服务完全兼容 4.0 及早期版本,继承了其一贯的安全,稳定,高效等特点并带来了全新的 Stream 数据结构及多项优 ...

  4. Memcached 最新版本发布,不再仅仅是个内存缓存了

    导读 Memcached 1.5.18和之后版本可以在服务重启时恢复内存缓存.新版本还通过DAX文件系统挂载来实现缓存持久性功能. 可以通过在启动选项使用该功能: -e /tmpfs_mount/me ...

  5. Redis 学习(三) —— 事务、消息发布订阅

    一.Redis事务 Redis 提供的事务机制与传统的数据库事务有些不同,传统数据库事务必须维护以下特性:原子性(Atomicity), 一致性(Consistency),隔离性(Isolation) ...

  6. 补习系列(13)-springboot redis 与发布订阅

    目录 一.订阅发布 常见应用 二.Redis 与订阅发布 三.SpringBoot 与订阅发布 A. 消息模型 B. 序列化 C. 发布消息 D. 接收消息 小结 一.订阅发布 订阅发布是一种常见的设 ...

  7. springboot2.X 集成redis+消息发布订阅

    需求场景:分布式项目中,每个子项目有各自的 user 数据库, 在综合管理系统中存放这所有用户信息, 为了保持综合管理系统用户的完整性, 子系统添加用户后将用户信息以json格式保存至redis,然后 ...

  8. php redis pub/sub(Publish/Subscribe,发布/订阅的信息系统)之基本使用

    一.场景介绍 最近的一个项目需要用到发布/订阅的信息系统,以做到最新实时消息的通知.经查找后发现了redis pub/sub(发布/订阅的信息系统)可以满足我的开发需求,而且学习成本和使用成本也比较低 ...

  9. redis 发布订阅实现异步实时发短信

    redis 中发布和订阅可以实现消息的实时传输,这里我只是用它的事件驱动,当客户端发送了消息,服务器端立马可以接收指令处理相应的业务逻辑. 客户端 client.php <?php //发布 $ ...

  10. 基于Redis消息的订阅发布应用场景

    目录 基于Redis消息的订阅发布应用场景 1.应用背景 2.困境 2.1 锁表风险 2.2 实时性差 2.3 增加编程复杂性 2.4 实时效果 3.解决方案 3.1 前端传值给服务端 3.2 服务端 ...

随机推荐

  1. 《ASP.ENT Core 与 RESTful API 开发实战》-- (第5章)-- 读书笔记(下)

    第 5 章 使用 Entity Framework Core 5.4 重构 Controller 和 Action 重构 AuthorController 构造函数重构 public IMapper ...

  2. Python numpy数组操作(分割数组)

    分割数组 函数 数组及操作 split 将一个数组分割为多个子数组 hsplit 将一个数组水平分割为多个子数组(按列) vsplit 将一个数组垂直分割为多个子数组(按行) numpy.split ...

  3. JS leetcode 旋转数组 题解分析

    壹 ❀ 引 今天来做一道同样简单,但是挺有趣的题,题目来自leetcode189. 旋转数组,题目描述如下: 给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数. 示例 1: 输入: ...

  4. ES6学习 第一章 let 和 const 命令

    前言: 最近开始看阮一峰老师的<ECMAScript 6 入门>(以下简称原文)学习ECMAScript 6(下文简称ES6)的知识,整理出一些知识点加上我的理解来做成文章笔记.按照章节为 ...

  5. 如何查看Spring Boot 默认的数据库连接池类型

    使用的Spring Boot的版本:2.3.4.RELEASE 先给出答案:com.zaxxer.hikari.HikariDataSource 怎么知道的呢? 新建一个Spring boot项目:s ...

  6. 信捷电气 - C++工程师面试题(社招:3-5年工作经验)

    1. char i = 1; printf("%d",i);    // char字节用printf以整数型打印出来 2. int (*a[10])int a[10]是函数指针数组 ...

  7. Ansible的基本配置

    目录 定义主机和组 主机的定义 主机组的定于 主机组的嵌套 选择主机和组 匹配主机 使用通配符匹配 配置文件优先级 配置文件详解 配置文件段 配置文件参数说明 配置案例 1. 在节点上创建一个普通用户 ...

  8. flutter打包android的一些配置修改(解决白屏,视频闪退)

    1.打包后视频播放闪退 视频播放器选择了flutter_tencentplayer(https://github.com/qq326646683/flutter_tencentplayer) 解决:不 ...

  9. 项目实战:Qt监测操作系统cpu温度v1.1.0(支持windows、linux、国产麒麟系统)

    需求   使用Qt软件开发一个检测cpu温度的功能.  兼容windows.linux,国产麒麟系统(同为linux) Demo   windows上运行(需要管理员权限):     国产麒麟操作上运 ...

  10. 文件的拓展及文件函数,定义函数及函数参数---day09

    1.文件的拓展模式 utf-8 编码格式下,默认一个中文三个字节,一个英文或符号占用一个字节 read() 功能:读取字符的个数(里面的参数代表字符个数) seek() 功能:调整指针的位置(里面的参 ...