Garnet开发实战:准备好跟Redis说拜拜了吗?

时间:04/02/2024 16:29:27   作者:ChenReal    阅读:47

最近,技术圈先后出现了两则新闻:

  • 1、Redis准备要闭源。
  • 2、微软开源了Garnet。

1、Garnet是什么?

Garnet是微软研发的提供的远程缓存存储,可提供强大的性能(吞吐量和延迟)、可伸缩性、存储、恢复、群集分片、密钥迁移和复制功能。Garnet 可以与现有的 Redis 客户端配合使用。

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

以上是微软官方发的介绍。一句话总结:Garnet是微软自家研发的Redis,能够兼容Redis协议,并且性能之强悍甚至超过了Redis。

我们把上面的两件事情联系在一起,似乎能够嗅到了什么不一样的气味。

好吧,商业的话题我们就此打住,我们着重聊聊技术。看看微软出品Garnet是怎么玩的,有没有传说中的那么神乎其技,是否能不能用以平替Redis。

2、编译发布

我们可以从 https://github.com/microsoft/garnet 下载源码进行编译。当然,也可以自己创建一个C#的项目工程,然后从NuGet引入Garnet库进行编译发布。

我选择的是第二种方法:

首先,创建一个.NET8.0的控制台项目。 garnet-1.png

接着,在Nuget引入Garnet。 garnet-2.jpg

然后,打开Program.cs,写入以下下代码。

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}");
}

最后,执行编译发布的命令

dotnet dotnet restore
dotnet publish -c Release -o ./app --self-contained false -f net8.0

3、Docker部署

首先,创建Dockerfile文件,详细内容如下:

FROM mcr.microsoft.com/dotnet/runtime:8.0

RUN rm /etc/localtime
RUN ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

WORKDIR /app

COPY ./app ./

EXPOSE 3278

ENTRYPOINT ["dotnet", "/app/YSC.GarnetServer.dll", "--config-import-path", "/app/garnet.conf"]

从上面可以看到,我们还需要一个增加一份名为garnet.conf的本地配置文件,去override默认的配置参数项目,常用参数有:PortMemorySizePassword

详细配置参数可以官方文档:

https://microsoft.github.io/garnet/docs/getting-started/configuration

我的garnet.conf配置是这样的:

{
  "Port":6379,
  "MemorySize":"256m",
  "AuthenticationMode":"Password",
  "Password":"012345"
}

接下来,执行命令构建Docker镜像。

docker build -t garnet_server .

最后,启动运行。

docker run -d --restart=always -p 3278:6379 --name garnet_server garnet_server

执行docker logs garnet_server查看Garnet Server的运行状态。

garnet-3.png

似乎成功了!打开Redis客户端验证一下,也没问题。 garnet-4.png

4、开发C#程序连接Garnet

首先,新建.NET控制台项目YSC.GarnetClient,然后Nuget引入StackExchange.Redis库。 garnet-5.png

然后,编写测试代码如下:

using StackExchange.Redis;

// 配置地址端口
var connString = "192.168.1.12:3278,password=012345";
// 创建连接
var connection = ConnectionMultiplexer.Connect(connString);
var db = connection.GetDatabase();
// 写入字符串
db.StringSet("StringKey","Hello Garnet!");
// 读取字符串
var value = db.StringGet("StringKey");
Console.WriteLine(value);

代码执行成功后,在我们的GUI客户端,也能够查到刚才所设置的Key-Value数据。 garnet-6.png

五、总结

通过上面的操作,我们成功将Garnet服务端应用运行起来了。并且用Redis客户端工具,以及C#程序代码验证了Garnet可以无缝地替代Redis。

这样我们开发项目选择缓存中间件时,又多了一个选择。相信有微软的背书,Garnet的生态会很快发展壮大。作为资深的.NETer,我肯定是满怀期待的。

至于Garnet性能嘛,暂时没时间去做测试,我选择相信微软官方的数据。

 

评论
0/200