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

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

  • 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的控制台项目。


Server项目

接着,在Nuget引入Garnet。

Nuget引入Garnet.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的运行状态。

Docker运行状态

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

客户端连接

4、开发C#程序连接Garnet

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

引入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性能嘛,暂时没时间去做测试,我选择相信微软官方的数据。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,558评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,002评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,024评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,144评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,255评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,295评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,068评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,478评论 1 305
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,789评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,965评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,649评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,267评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,982评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,800评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,847评论 2 351

推荐阅读更多精彩内容