GarnetServer 入门:使用 garnet-server 全局工具一键部署 Microsoft.Garnet RESP 服务器

发布时间:2026/9/15 12:25:55
GarnetServer 入门:使用 garnet-server 全局工具一键部署 Microsoft.Garnet RESP 服务器 GarnetServer 入门使用 garnet-server 全局工具一键部署 Microsoft.Garnet RESP 服务器【免费下载链接】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/garnetgarnet-server是 Garnet 仓库中随 Microsoft.Garnet 为骨架结合仓库内的工程文件、入口源码与默认配置系统讲解 garnet-server 的安装、启动、命令行配置、配置文件用法与源码级实现原理帮助读者快速搭建并调优自己的 Garnet 实例。garnet-server 是什么garnet-server是 Garnet 提供的一个 .NET 全局工具用于在命令行中直接托管Microsoft.GarnetRESP 服务器。它与以库形式嵌入应用的 NuGet 包Microsoft.Garnet相对应前者面向开箱即用的部署场景后者面向自托管的应用集成场景。从工程文件 main/GarnetServer/GarnetServer.csproj 可以确认其工具属性OutputTypeExe/OutputType ServerGarbageCollectiontrue/ServerGarbageCollection PackageIdgarnet-server/PackageId ToolCommandNamegarnet-server/ToolCommandName PackAsTooltrue/PackAsTool关键点解读ToolCommandName为garnet-server即安装后可直接在终端使用的命令名PackAsTool为true表示该工程会被打包成 .NET 全局工具发布到 NuGet这是它能通过dotnet tool install安装的根本原因ServerGarbageCollection为true说明服务器模式启用了服务器 GC这是面向高并发缓存服务端的默认选择工程同时引用 libs/host/Garnet.host.csproj、libs/server/Garnet.server.csproj 以及 Tsavorite 的 Azure Storage Device 工程意味着该工具完整包含了服务器核心逻辑、宿主抽象与云存储后端支持。安装与快速启动Garnet 官方文档见 website/docs/welcome/releases.md给出的安装与启动方式非常简洁dotnet tool install --global garnet-server garnet-server其中dotnet tool install --global会将工具安装到用户级全局目录安装完成后即可在任何目录下直接调用garnet-server命令。按照 main/GarnetServer/README.md 的说明Thegarnet-serverby itself will create a Garnet server using the default port; for full options, seegarnet-server --help.即不带任何参数直接运行garnet-server就会以默认端口启动一个 Garnet 服务器若要查看全部可用选项运行garnet-server --help。验证服务器可用Garnet 采用 RESP 线协议因此可以直接使用 Redis 生态的客户端工具进行验证。以redis-cli为例参考 website/docs/welcome/releases.md 中的演示redis-cli 127.0.0.1:6379 set key value OK 127.0.0.1:6379 get key value这意味着现有 Redis 客户端如 C# 的 StackExchange.Redis无需任何修改即可连接 Garnet。Garnet 项目本身也在仓库 README.md 中强调Garnet 以 RESP 协议为起点可以使用当今大多数编程语言中未修改的 Redis 客户端。命令行参数与默认端口garnet-server --help会输出全部命令行选项。服务器所有可调参数的默认值定义在 libs/host/defaults.conf 中其中最基本的几个如下参数默认值说明Port6379服务器监听端口与 Redis 默认端口一致Addressnull任意地址以空格或逗号分隔的 IP 地址列表指定服务器绑定的地址MemorySize/LogMemorySize16g主日志main log可用的总内存内联 堆内存IndexMemorySize128m哈希索引的起始大小AuthenticationModeNoAuth认证模式可选NoAuth、Password、Aad、ACLPasswordnull密码认证模式下使用的认证字符串EnableAOFfalse是否启用追加写日志append-only file实现持久化EnableTLSfalse是否启用 TLS 安全传输EnableClusterfalse是否启用集群模式EnableLuafalse是否启用 Lua 脚本支持例如要在一个指定 IP 上、以密码认证方式启动并启用 AOF可以这样执行garnet-server --address 127.0.0.1 --port 6379 --auth Password --password yourpass --enable-aof需要说明的是命令行的布尔开关如--enable-aof、--enable-cluster、--enable-tls与配置文件中的键EnableAOF、EnableCluster、EnableTLS一一对应二者只是同一配置的两种表达形式。高频实战参数速查结合 libs/host/defaults.conf 中更丰富的注释以下参数在真实部署中经常需要调整存储与内存PageSize默认16m主日志每页大小向下取整到 2 的幂最小 512 字节、SegmentSize默认1g磁盘上每个日志段的大小、MutablePercent默认90保持可变的日志内存百分比、EnableStorageTier是否启用存储分层把数据分层到磁盘以支撑超内存数据集配合--logdir指定存储目录。持久化EnableAOF写前日志、CommitFrequencyMs默认0AOF 提交频率0 表示每次操作立即提交-1 表示手动通过COMMITAOF提交、AofSizeLimitAOF 大小上限达到后触发截断/检查点。认证与安全AuthenticationMode、Password、AclFile外部 ACL 用户文件、EnableTLS、CertFileName证书文件支持 PFX 或 PEM 格式、CertPassword证书密码。可观测性LatencyMonitor延迟监控、CommandStatsMonitor按命令统计调用/失败/拒绝次数通过INFO COMMANDSTATS暴露、SlowLogThreshold慢日志阈值微秒数0 禁用、MetricsSamplingFrequency指标采样频率秒数0 禁用。日志LogLevel默认Warning可选Trace、Debug、Information、Warning、Error、Critical、None、FileLogger启用文件日志并指定路径、DisableConsoleLogger。使用配置文件 garnet.conf除了命令行参数Garnet 还支持通过 JSON 格式的配置文件集中管理所有选项。仓库内的 main/GarnetServer/garnet.conf 就是一个现成的配置模板其头部注释说明了用法Use this file to configure any values different from the defaults specified in libs/host/defaults.conf In order to use this file, run GarnetServer with the --config-import-path command line argument (e.g. GarnetServer.exe --config-import-path /path/to/garnet.conf).也就是说配置文件只需填写与默认值不同的项其余自动采用 libs/host/defaults.conf 中的默认值通过--config-import-path参数指定配置文件路径即可加载例如garnet-server --config-import-path /path/to/garnet.conf一个典型的自定义配置示例仿照模板注释中的写法{ Port: 1234, Address: 1.2.3.4, LogMemorySize: 32g, EnableAOF: true, CommitFrequencyMs: 100, AuthenticationMode: Password, Password: yourpass }配置文件与命令行参数遵循相同的键名体系二者可以混用命令行参数拥有更高优先级。这种默认值 覆盖值的设计让单个实例的差异化配置变得非常轻量。源码视角garnet-server 的启动流程garnet-server的可执行入口是 main/GarnetServer/Program.cs核心逻辑非常精简using var server new GarnetServer(args); // Optional: register custom extensions RegisterExtensions(server); // Start the server server.Start(); Thread.Sleep(Timeout.Infinite);启动流程可以拆解为三步构造GarnetServer实例将命令行参数args传入构造函数由宿主层libs/host/GarnetServer.cs解析配置、初始化 Tsavorite 存储引擎与网络监听可选注册自定义扩展RegisterExtensions方法演示了如何为服务器注册自定义命令、自定义数据类型与存储过程调用server.Start()启动服务随后主线程休眠服务器进入常驻服务状态。任何初始化异常都会被捕获并以Unable to initialize server due to exception: {ex.Message}的形式打印到控制台。如何基于源码注册自定义扩展Program.cs中的RegisterExtensions是理解 Garnet 扩展机制的绝佳示例。它展示了四类扩展注册方式对应的实现类位于 main/GarnetServer/Extensions 目录1. 自定义原始字符串命令Read-Modify-Write 类型var setIfPmCmdInfo new RespCommandsInfo { Name SETIFPM, Arity 4, FirstKey 1, LastKey 1, Step 1, Flags RespCommandFlags.DenyOom | RespCommandFlags.Write, AclCategories RespAclCategories.String | RespAclCategories.Write, }; server.Register.NewCommand(SETIFPM, CommandType.ReadModifyWrite, new SetIfPMCustomCommand(), setIfPmCmdInfo);其中RespCommandsInfo提供了完整的 RESP 命令元数据命令名、参数个数、键位置、命令标志与 ACL 分类注册后该命令会出现在客户端执行COMMAND/COMMAND INFO的结果中。2. 自定义数据类型与对象命令var factory new MyDictFactory(); server.Register.NewType(factory); server.Register.NewCommand(MYDICTSET, CommandType.ReadModifyWrite, factory, new MyDictSet(), new RespCommandsInfo { Arity 4 }); server.Register.NewCommand(MYDICTGET, CommandType.Read, factory, new MyDictGet(), new RespCommandsInfo { Arity 3 });3. 事务型存储过程Transaction Procedureserver.Register.NewTransactionProc(READWRITETX, () new ReadWriteTxn(), readWriteTxCmdInfo);4. 非事务型存储过程server.Register.NewProcedure(SUM, () new Sum()); server.Register.NewProcedure(SETMAINANDOBJECT, () new SetStringAndList());这些扩展注册完成后客户端即可通过db.Execute(SETIFPM, key, value, prefix)StackExchange.Redis 风格直接调用。这说明garnet-server不只是开箱即用的服务还可以通过修改 main/GarnetServer/Program.cs 后自行编译快速扩展出贴合业务的自定义命令体系。其他部署形态对比除了garnet-server全局工具仓库还支持另外两种部署方式了解它们有助于选择适合自己场景的形态1. NuGet 库自托管将Microsoft.Garnet以库的形式嵌入自己的应用。官方文档website/docs/welcome/releases.md给出了最小示例using Garnet; try { using var server new GarnetServer(args); server.Start(); Thread.Sleep(Timeout.Infinite); } catch (Exception ex) { Console.WriteLine($Unable to initialize server due to exception: {ex.Message}); }这与 main/GarnetServer/Program.cs 的入口逻辑完全一致——事实上garnet-server 工具本身就是以 NuGet 库方式自托管的官方参考实现源码可直接复用。2. Docker 容器仓库根目录提供了多份 DockerfileDockerfile、Dockerfile.ubuntu、Dockerfile.nanoserver、Dockerfile.alpine 等。官方文档中 Linux 下的启动命令为docker run --networkhost --ulimit memlock-1 ghcr.io/microsoft/garnetMacOS 下则映射端口后使用redis-cli连接docker run -p 6379:6379 --ulimit memlock-1 ghcr.io/microsoft/garnet三种形态的取舍可以概括为追求最快上手选dotnet tool install --global garnet-server需要与应用深度集成或自定义扩展选 NuGet 库自托管希望环境隔离、便于运维选 Docker。进阶玩转命令行选项garnet-server --help是探索全部能力的第一入口。结合 libs/host/defaults.conf 中 540 余行的注释以下几组选项值得重点实验集群模式--enable-cluster开启后可以使用标准 Redis 集群命令创建和管理分片与副本集群相关参数包括ClusterAnnouncePort、ClusterAnnounceIp、GossipDelay默认 5 秒、ClusterTimeout默认 60 秒等。存储分层--storageEnableStorageTier配合--logdir可把数据分层到 SSD/云存储支撑远超内存的数据集这正是 Tsavorite 混合日志hybrid log能力的体现。读缓存EnableReadCache默认false开启后配合ReadCacheMemorySize默认1g与ReadCachePageSize默认4m可加速对磁盘记录的访问。恢复与检查点Recover从最近的检查点与日志恢复、CheckpointDir、CompactionFrequencySecs、CompactionTypeNone/Shift/Lookup/Scan其中Lookup被注释推荐用于生产。由于 Garnet 遵循RESP 兼容 可插拔扩展的设计哲学以上所有配置最终都汇入 libs/host/GarnetServer.cs 与 libs/host/Configuration/Options.cs 中的配置模型命令行参数与配置文件在此完成归一化解析再下发到服务器各组件。总结本文围绕 main/GarnetServer/README.md 展开完整梳理了garnet-server全局工具的定位、安装、启动、命令行与配置文件用法并深入到 main/GarnetServer/Program.cs 与 libs/host/defaults.conf 理解其实现原理与扩展机制。核心要点回顾garnet-server是打包为 .NET 全局工具的 RESP 服务器一条dotnet tool install --global garnet-server即可安装直接运行即以默认端口 6379 启动所有可调参数均有合理默认值定义于 libs/host/defaults.conf可通过命令行参数或--config-import-path加载的 JSON 配置文件覆盖入口源码 main/GarnetServer/Program.cs 展示了标准启动流程并附带了四类自定义扩展命令、类型、事务过程、非事务过程的注册范例是学习 Garnet 扩展开发的起点与 NuGet 自托管、Docker 部署并列garnet-server是三者中上手成本最低的一种适合快速验证、开发联调与小规模生产场景。【免费下载链接】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),仅供参考