微软开源Garnet高性能缓存服务安装
Garnet介绍
Garnet是一款微软研究院基于C#开发而开源的高性能缓存服务,支持Windows、Linux多平台部署,Garnet兼容Redis服务API,在性能和使用架构上较Redis有很大提升(官方说法),并提供与Redis一样的命令操作存储数据,因此可以在不更换现有Redis客户端与库的情况下,即可无缝使用Garnet,从而降低开发难度与使用成本;
官方介绍(机翻)
Garnet 是 Microsoft Research 推出的一种新型远程缓存存储,其设计速度极快、可扩展且延迟低。Garnet 在单个节点内是线程可扩展的。它还支持分片集群执行、复制、检查点、故障转移和事务。它可以在主内存以及分层存储(例如 SSD 和 Azure 存储)上运行。Garnet支持丰富的API接口和强大的可扩展性模型。
Garnet 使用 Redis 的 RESP 作为其主要线路协议。因此,人们可以将 Garnet 与 大多数编程语言中可用的未经修改的 Redis 客户端一起使用,例如C# 中的StackExchange.Redis 。与其他开源缓存存储相比,您可以获得更好的性能、延迟、可扩展性和耐用性功能。
请注意,Garnet 是 Microsoft Research 的一个研究项目,该项目也应如此对待。也就是说,我们是一群充满热情的研究人员和开发人员,目前正在全职研究它,以使其尽可能稳定和高效。我们的目标是围绕Garnet创建一个充满活力的社区。事实上,Garnet 的质量已经足够高,以至于 Microsoft 的多个第一方和平台团队已经在内部部署了 Garnet 版本好几个月了。
Garnet具有以下主要优点:
- 相对于同类开源缓存存储,小批量和许多客户端会话的服务器吞吐量(操作/秒)提高了几个数量级。
- 在 Windows 和 Linux 上启用加速 TCP 的商品云 (Azure) 计算机上,单次操作延迟极低(在 99.9% 时通常小于 300 微秒)。
- 随着客户端数量的增加,无论有或没有客户端批处理,都可以实现更好的可扩展性。
- 能够通过单个共享内存服务器实例使用服务器计算机的所有 CPU/内存资源(无需节点内集群)。
- 支持大于内存的数据集,溢出到本地和云存储设备。
- 数据库功能,例如快速检查点和恢复以及发布/订阅。
- 支持多节点分片哈希分区(Redis“集群”模式)、状态迁移和复制。
- 通过全面的测试套件进行了良好的测试(针对 Garnet 及其存储层 Tsavorite 进行了数千次单元测试)。
- 易于演变和扩展的 C# 代码库。
如果您的应用程序或服务需要一个具有大量实用功能、高性能以及基于最先进的 Microsoft Research 技术的现代设计的缓存存储,那么 Garnet 就是适合您的系统。在此处查看有关Garnet性能优势的更多详细信息。
Garnet整体架构
官方文档
Welcome to Garnet | Garnet
github
GitHub - microsoft/garnet: 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.
性能预览
微软官方将 Garnet 与领先的开源缓存存储进行比较,参与评测的同类开源服务:Garnet、Redis、KeyDB、Dragonfly;
在相同配置环境下,分别基于:
- 实验 1:不同数量的客户端会话的吞吐量
- 实验 2:不同批量大小的吞吐量
- 实验 3:不同数量的客户端会话的延迟
- 实验 4:不同批量大小的延迟
四个维度进行性能比较;从性能评测结果上来看,Garnet各项性能测试指标,均优于同类产品;
评测结果参见:
Introducing Garnet – an open-source, next-generation, faster cache-store for accelerating applications and services - Microsoft Research
Garnet安装
此项目开源源码,但官方并未提供已编译的二进制安装包,需要自行下载源码编译成可运行应用服务,此处参考官方教程,进行编译、安装;
参考官方入门Build教程:Build and Test | Garnet
注:根据官方文档显示,提供了dockerfile配置,可参考文档尝试docker部署;
安装环境
操作系统:Windows 8+
环境依赖: .Net 8
github下载
微软官方将源码开源放到了github上,本地如有安装Git命令行工具,则在任意文件夹内右键打开“Git Bash Here”窗口,输入如下git命令:
git clone https://github.com/microsoft/garnet.git
$ git clone https://github.com/microsoft/garnet.git
Cloning into 'garnet'...
remote: Enumerating objects: 10055, done.
remote: Counting objects: 100% (1629/1629), done.
remote: Compressing objects: 100% (848/848), done.
remote: Total 10055 (delta 846), reused 1000 (delta 759), pack-reused 8426
Receiving objects: 100% (10055/10055), 14.51 MiB | 1.47 MiB/s, done.
Resolving deltas: 100% (7168/7168), done.
通过git命令将工程版本切换到v1.0.0(当前最新版本)
git checkout v1.0.0
$ git checkout v1.0.0
Note: switching to 'v1.0.0'.You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by switching back to a branch.If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -c with the switch command. Example:git switch -c <new-branch-name>Or undo this operation with:git switch -Turn off this advice by setting config variable advice.detachedHead to falseHEAD is now at 1e5c7ad Initial commit
安装.Net8 SDK
检查Windows环境是否已安装.Net 8可运行环境,如果没有安装,请先从微软官方网站下载安装;此环境是.net应用必需使用的可运行时核心库与环境,用来支持C#和ASP.NET开发与运行。
进入已克隆的本地garnet工程根目录,检查本地是否安装.net 8
cd garnet/
dotnet test -c Release -f net8.0 -l "console;verbosity=detailed"
$ cd garnet/
$ dotnet test -c Release -f net8.0 -l "console;verbosity=detailed"正在确定要还原的项目…
C:\Program Files\dotnet\sdk\7.0.203\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.TargetFrameworkInference.targets(144,5): error NETSDK1045: 当前 .NET SDK 不支持将 .NET 8.0 设置为目标。请将 .NET 7.0 或更低版本设置为目标,或使用支持 .NET 8.0 的 .NET SDK 版本。 [D:\Workspaces\idea_2\garnet\samples\GarnetClientSample\GarnetClientSample.csproj]
C:\Program Files\dotnet\sdk\7.0.203\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.TargetFrameworkInference.targets(144,5): error NETSDK1045: 当前 .NET SDK 不支持将 .NET 8.0 设置为目标。请将 .NET 7.0 或更低版本设置为目标,或使用支持 .NET 8.0 的 .NET SDK 版本。 [D:\Workspaces\idea_2\garnet\playground\GarnetClientStress\GarnetClientStress.csproj]
此处检查为缺少.Net8 SDK运行环境,从微软官方下载套件
.Net8.0 SDK主页:下载 .NET 8.0 (Linux、macOS 和 Windows)
.Net8.0 SDK下载页:下载 .NET 8.0 SDK (v8.0.203) - Windows x64 Installer
打开页面会自动下载dotnet-sdk-8.0.203-win-x64.exe安装程序,待下载完毕后,双击默认安装即可;
安装后,再一次检测.net8可运行环境,根据电脑硬件情况,可能需要执行几分钟。
dotnet test -c Release -f net8.0 -l "console;verbosity=detailed"
$ dotnet test -c Release -f net8.0 -l "console;verbosity=detailed"欢迎使用 .NET 8.0!
---------------------
SDK 版本: 8.0.203遥测
---------
.NET 工具会收集用法数据,帮助我们改善你的体验。它由 Microsoft 收集并与社区共享。你可通过使用喜欢的 shell 将 DOTNET_CLI_TELEMETRY_OPTOUT 环境变量设置为 "1" 或 "true" 来选择退出遥测。阅读有关 .NET CLI 工具遥测的更多信息: https://aka.ms/dotnet-cli-telemetry----------------
已安装 ASP.NET Core HTTPS 开发证书。
若要信任该证书,请运行 "dotnet dev-certs https --trust"
了解 HTTPS: https://aka.ms/dotnet-https----------------
编写第一个应用: https://aka.ms/dotnet-hello-world
了解新增功能: https://aka.ms/dotnet-whats-new
浏览文档: https://aka.ms/dotnet-docs
报告问题并在 GitHub 上查找来源: https://github.com/dotnet/core
使用 "dotnet --help" 查看可用命令或访问: https://aka.ms/dotnet-cli
--------------------------------------------------------------------------------------正在确定要还原的项目…已还原 D:\Workspaces\garnet\libs\storage\Tsavorite\cs\src\core\Tsavorite.core.csproj (用时 53.98 sec)。已还原 D:\Workspaces\garnet\libs\storage\Tsavorite\cs\src\devices\AzureStorageDevice\Tsavorite.devices.AzureStorageDevice.csproj (用时 53.98 sec)。... 略 (一大堆过程打印)已通过 ClusterTLSRPrimaryRestart(False,False) [1 s]已通过 ClusterTLSRRedirectWrites [1 s]
NUnit Adapter 4.5.0.0: Test execution complete已通过 ClusterTLSRReplicaOfTest(True) [652 ms]已通过 ClusterTLSRReplicaOfTest(False) [321 ms]测试运行成功。
测试总数: 206通过数: 206
总时间: 9.0286 分钟
构建工程
通过命令行对工程源码进行构建,从而编译与生成可运行程序;
第一步:dotnet restore
dotnet restore正在确定要还原的项目…已还原 D:\Workspaces\garnet\playground\ClusterStress\ClusterStress.csproj (用时 1.35 sec)。已还原 D:\Workspaces\garnet\samples\MetricsMonitor\MetricsMonitor.csproj (用时 1.35 sec)。... 略已还原 D:\Workspaces\garnet\playground\Embedded.perftest\Embedded.perftest.csproj (用时 129 ms)。1 个项目(共 19 个)是最新的,无法还原。
第二步:dotnet build -c Release
$ dotnet build -c Release
适用于 .NET MSBuild 版本 17.9.6+a4ecab324正在确定要还原的项目…所有项目均是最新的,无法还原。Garnet.common -> D:\Workspaces\garnet\libs\common\bin\AnyCPU\Release\net7.0\Garnet.common.dllGarnet.common -> D:\Workspaces\garnet\libs\common\bin\AnyCPU\Release\net6.0\Garnet.common.dll... 略Garnet.test.cluster -> D:\Workspaces\garnet\test\Garnet.test.cluster\bin\AnyCPU\Release\net8.0\Garnet.test.cluster.dllGarnet.test.cluster -> D:\Workspaces\garnet\test\Garnet.test.cluster\bin\AnyCPU\Release\net6.0\Garnet.test.cluster.dll已成功生成。0 个警告0 个错误已用时间 00:01:08.00
执行构建成功后,会在garnet\main\GarnetServer\bin\AnyCPU\Release目录下生成多个.net版本(如果本机有装多个.net版本)的运行程序;

进入其中目录查看,已构建生成Garnet应用的dll库和GarnetServer.exe运行程序;可双击单独运行GarnetServer.exe,即可启动Garnet服务;

注:此net8.0文件夹下,实际就是我们已经编译后的可分发运行的exe程序和相关依赖库,理论上复制完整的net8.0文件夹在任意有安装.Net 8.0 SDK对应版本Windows操作系统电脑上,直接双击GarnetServer.exe运行服务(暂未在其它Windows电脑上验证测试,待测试后,上传到GitCode上供下载);
本文参考官方文档,继续持行后续步骤;
运行服务
完成上述两步后,即已编译好Garnet服务,可直接部署运行Garnet服务;如下操作
进入garnet/main/GarnetServer/目录
$ cd main/GarnetServer/
运行Garnet服务
dotnet run -c Release -f net8.0
Garnet可以配置索引大小、内存大小、页面大小、数据文件路径、检查点路径、IP、端口等启动参数;如下,指定索引大小为为512M;
dotnet run -c Release -f net8.0 -- -i 512m
$ dotnet run -c Release -f net8.0 -- -i 512m_________/_||___||_\ Garnet 1.0.0 64 bit; standalone mode'. \ / .' Port: 3278'.\ /.' https://aka.ms/GetGarnet'.'* Ready to accept connections
到此服务已正常启动,Garnet默认情况下,监听服务TCP端口为3278,可通过Redis客户端工具进行远程或本地访问,如访问不通,排查防火墙是否限制端口访问;
如果想了解更多Garnet服务启动命令配置,可通过--help查看配置参数帮助详情
dotnet run -c Release -f net8.0 -- --help
$ dotnet run -c Release -f net8.0 -- --help
GarnetServer
Copyright (c) Microsoft Corporation--port (Default: 3278) Port to run server on--bind IP address to bind server to(default: any)-m, --memory (Default: "16g") Total log memory used in bytes(rounds down to power of 2)-p, --page (Default: "32m") Size of each page in bytes (roundsdown to power of 2)-s, --segment (Default: "1g") Size of each log segment in bytes ondisk (rounds down to power of 2)-i, --index (Default: "8g") Size of hash index in bytes (roundsdown to power of 2)--index-max-size Max size of hash index in bytes(rounds down to power of 2)...略
客户端访问
RedisInsight
本地有安装RedisInsight客户端工具,该工具用于Redis服务访问使用,该工具UI美观,使用方便,因此本处以该工具做为演示;

配置连接信息
Host:127.0.0.1
Port:3278
Database Alias:本地-Garnet服务
点击"Test Connection" 进行连接测试,提示测试成功后,点击“Add Redis Database”按钮保存配置即可;
通过主界面,打开配置的“本地-Garnet服务”访问Garnet服务,Garnet高度兼容Redis命令与接口,使用上和Redis操作相同,因此可以根据需要,添加与查询各种Key/Value键值;
redis-cli
也可通过CMD命令行窗口调用redis-cli客户端工具直接访问;
redis-cli.exe -h 127.0.0.1 -p 3278

结尾
到此Garnet服务安装与运行成功,更多特性与玩法,可自行参考官方文档深入摸索;
因微软刚将Garnet开源,此项目还处于持续研发与验证中,除了微软内部有使用经验外,外部企业与项目应用理因较少(未知),属于面向大众使用比较新的项目,除官方文档外,缺乏足够的社区信息和企业应用经验,来提供借鉴;
如要在项目上调研使用,需要考虑Garnet服务落地使用风险,因此尝试生产应用或大规模投产,请三思而后行;
相关文章:
微软开源Garnet高性能缓存服务安装
Garnet介绍 Garnet是一款微软研究院基于C#开发而开源的高性能缓存服务,支持Windows、Linux多平台部署,Garnet兼容Redis服务API,在性能和使用架构上较Redis有很大提升(官方说法),并提供与Redis一样的命令操…...
云计算系统管理(ADMIN)
01. 公司需要将/opt/bjcat3目录下的所有文档打包备份,如何实现? 答案: # tar -czf /tmp/bjcat3.tar.gz /opt/bjcat302. 简述创建crontab计划任务的流程 答案: 利用crontab –e -u 用户名 进入计划任务编辑模式 分 时 日 月 周 …...
Spark spark-submit 提交应用程序
Spark spark-submit 提交应用程序 Spark支持三种集群管理方式 Standalone—Spark自带的一种集群管理方式,易于构建集群。Apache Mesos—通用的集群管理,可以在其上运行Hadoop MapReduce和一些服务应用。Hadoop YARN—Hadoop2中的资源管理器。 注意&…...
IOS面试题编程机制 51-55
51. 在iPhone应用中如何保存数据?有以下几种保存机制: 1).通过web服务,保存在服务器上 2).通过NSCoder固化机制,将对象保存在文件中 3).通过SQlite或CoreData保存在文件数据库中52. 阐述Block 的理解?并写出一个使用Block执行UIVew动画?Block是可以获取其他函数局部变量的…...
话题——AI大模型学习
AI大模型学习 在当前技术环境下,AI大模型学习不仅要求研究者具备深厚的数学基础和编程能力,还需要对特定领域的业务场景有深入的了解。通过不断优化模型结构和算法,AI大模型学习能够不断提升模型的准确性和效率,为人类生活和工作…...
MySQL基础复习
目录 一、简单的命令 二、SQL语句分类 三、简单查询 四、条件查询 五、排序 一、简单的命令 net start 服务名称 net stop 服务名称 mysql -uroot -p123456 显示密码形式 mysql -uroot -p 隐藏密码形式 exit 退出 show databases; 查看MySQL中的数据库有哪些 use test…...
Zookeeper(八)序列化与协议
目录 一 序列化与反序列化1.1 Jute序列化工具1.1 Recor接口1.2 OutputArchive和InputArchive 二 通信协议2.1 请求部分2.1.1 请求头2.2.2 请求体2.1.3 案例分析 2.2 响应部分2.2.1 响应头2.2.2 响应内容2.2.3 案例分析 官网:Apache ZooKeeper 一 序列化与反序列化 …...
人工智能之Tensorflow变量作用域
在TensoFlow中有两个作用域(Scope),一个时name_scope ,另一个是variable_scope。variable_scope主要给variable_name加前缀,也可以给op_name加前缀;name_scope给op_name加前缀。 variable_scope 通过所给的名字创建或…...
ElasticSearch插件安装及配置
Docker安装ElasticSearch docker compose 安装直接看步骤三:新建索引 1、安装elasticsearch (1)下载elasticsearch和kibana docker pull elasticsearch:7.9.1 docker pull kibana:7.9.1(2)配置 mkdir -p /mydata/…...
vue+Echarts实现多设备状态甘特图
目录 1.效果图 2.代码 3.注意事项 Apache ECharts ECharts官网,可在“快速上手”处查看详细安装方法 1.效果图 可鼠标滚轮图表和拉动下方蓝色的条条调节时间细节哦 (注:最后一个设备没有数据,所以不显示任何矩形)…...
STM32使用滴答定时器实现delayms
在STM32上使用SysTick实现jiffies(时间戳)并且实现delay_ms 代码实现: volatile uint32_t jiffies 0; // 用于记录系统运行的jiffies数 void SysTick_Handler(void) {/* 每次SysTick中断,jiffies增加 */jiffies; }uint32_t tick…...
k8s的volumn解析
背景 k8s中有一套自己的存储逻辑,它和docker中的volumn类似,本文就来看一下k8s的volunm的存储设计 k8s的volumn 1.EmptyDir类型的volumn 这种类型的volumn是Pod内的容器共享的,volumn的生命周期和Pod的生命周期是一致的,不过大…...
Golang获取音视频时长信息
文章目录 一、工具简介二、使用golang获取时间长 一、工具简介 这些工具都是与多媒体处理和流媒体相关的开源工具,它们都属于 FFmpeg 多媒体框架。 FFmpeg 是一个用于处理多媒体内容(音频、视频、图像等)的命令行工具。它可以执行各种各样…...
LeetCode 面试经典150题 14.最长公共前缀
题目: 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 ""。 思路: 代码: class Solution {public String longestCommonPrefix(String[] strs) {if (strs.length 0) {return &…...
自注意力机制的理解
一、自注意力要解决什么问题 循环神经网络由于信息传递的容量以及梯度消失问题,只能建立短距离依赖关系。为了建立长距离的依赖关系,可以增加网络的层数或者使用全连接网络。但是全连接网络无法处理变长的输入序列,另外,不同的输…...
win10-误删winsock恢复方法
文件链接放在最前面 链接:https://pan.baidu.com/s/1i9X0HJJOfo63fbtOETc1Xw?pwdlfqx 提取码:lfqx 误删后应该还是可以正常连接网络的,但是重启过后直接以太网和wifi都是无法使用的。下图是我后面网络正常补充的图片 误删后是只有飞行模式…...
c#矩阵求逆
目录 一、矩阵求逆的数学方法 1、伴随矩阵法 2、初等变换法 3、分块矩阵法 4、定义法 二、矩阵求逆C#代码 1、伴随矩阵法求指定3*3阶数矩阵的逆矩阵 (1)伴随矩阵数学方法 (2)代码 (3)计算 2、对…...
array go 语言的数组 /切片
内存地址通过& package mainimport "fmt"func main() {var arr [2][3]int16fmt.Println(arr)fmt.Printf("arr的地址是: %p \n", &arr)fmt.Printf("arr[0]的地址是 %p \n", &arr[0])fmt.Printf("arr[0][0]的地址是 %p \n"…...
【Stable Diffusion】专栏介绍和文章索引(持续更新中)
目录 1 背景2 思考3 文章索引(持续更新中)3.1 入门3.2 初级3.3 中级3.3 高级 1 背景 最近开始学习AIGC,对Stable Diffusion比较感兴趣,所以新建了这个专栏,来记录自己在使用和学习Stable Diffusion的一些方法、资料以…...
RPC 快速入门
一、What 1)小故事 张三和李四都在同一个家公司负责商品交易的模块,两个人平时开发甚是紧密。 🙋🏻♂️ 张三:“李四,我这边一个商品下单了,但是付款数额不对,你帮我查下支付有没…...
接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...
【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...
NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...

