最近,技术圈先后出现了两则新闻:
- 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的控制台项目。
接着,在Nuget引入Garnet。
然后,打开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默认的配置参数项目,常用参数有:Port、MemorySize、Password。
详细配置参数可以官方文档:
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的运行状态。
似乎成功了!打开Redis客户端验证一下,也没问题。
4、开发C#程序连接Garnet
首先,新建.NET控制台项目YSC.GarnetClient
,然后Nuget引入StackExchange.Redis
库。
然后,编写测试代码如下:
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服务端应用运行起来了。并且用Redis客户端工具,以及C#程序代码验证了Garnet可以无缝地替代Redis。
这样我们开发项目选择缓存中间件时,又多了一个选择。相信有微软的背书,Garnet的生态会很快发展壮大。作为资深的.NETer,我肯定是满怀期待的。
至于Garnet性能嘛,暂时没时间去做测试,我选择相信微软官方的数据。