Garnet——开源的无损替代Redis的最强方案

2024-08-13 18:59:27 浏览数 (2)

Redis不再开源,后续使用3月20日以后的版本需要遵守新的协议。协议详情可以参考:

https://github.com/redis/redis?tab=License-1-ov-file#readme

以下是协议内容部分截图:

微软在redis即将闭源的情况下,开源了它的一款替代性项目产品,叫garnet,兼容redis的所有操作方式和通讯协议。并且采用MIT开源协议。项目地址:

https://github.com/microsoft/garnet

MIT协议内容很简单,全部内容如图所示:

先来个截取自官方文档的一个Garnet的一个简单介绍:

代码语言:javascript复制
/***********
Garnet 是 Microsoft Research 推出的一种新型远程缓存存储,其设计速度极快、可扩展且延迟低。Garnet 在单个节点内是线程可扩展的。它还支持分片集群执行、复制、检查点、故障转移和事务。它可以在主内存以及分层存储(例如 SSD 和 Azure 存储)上运行。Garnet支持丰富的API接口和强大的可扩展性模型。
Garnet 使用 Redis 的 RESP 作为其主要线路协议。因此,人们可以将 Garnet 与 大多数编程语言中可用的未经修改的 Redis 客户端一起使用,例如 C# 中的StackExchange.Redis 。与其他开源缓存存储相比,您可以获得更好的性能、延迟、可扩展性和耐用性功能。
具有以下主要优点:
相对于同类开源缓存存储,小批量和许多客户端会话的服务器吞吐量(操作/秒)提高了几个数量级。
在 Windows 和 Linux 上启用加速 TCP 的商品云 (Azure) 计算机上,单次操作延迟极低(在 99.9% 时通常小于 300 微秒)。
随着客户端数量的增加,无论有或没有客户端批处理,都可以实现更好的可扩展性。
能够通过单个共享内存服务器实例使用服务器计算机的所有 CPU/内存资源(无需节点内集群)。
支持大于内存的数据集,溢出到本地和云存储设备。
数据库功能,例如快速检查点和恢复以及发布/订阅。
支持多节点分片哈希分区(Redis“集群”模式)、状态迁移和复制。
通过全面的测试套件进行了良好的测试(针对 Garnet 及其存储层 Tsavorite 进行了数千次单元测试)。
易于演变和扩展的 C# 代码库。
********/

既然是替代品,那么就要测试下性能是不是可以满足我们的日常所需。以下做个最简单的测试。我本地已有redis的一个版本,印象中是5.0以上的某个版本。garnet目前源码是1.0.4版本,此处我先拉取源码到本地:

设置GarnetServer为启动项,直接在Visual Studio里面启动

Garnet兼容所有Redis的RESP协议和操作方式,那么使用一些redis客户端应该也是可以连接得上的。例如我使用一个老古董工具,redis desktop manager的试用版来试一下:

因为我没有配置用户等信息,所以可以直接连接上garnet服务。因此也可以证明,garnet的连接是和redis兼容的。

也可以确认,当你写代码来操作garnet,也可以利用已有的任意支持redis驱动或者包来直接操作,而不需要更换或重写,相当于可以无损切换。

以下做个简单测试,利用redis自带的工具 redis-benchmark.exe 来进行测试garnet和redis的性能,做一个简单对比。以下测试仅是本地单机环境下的测试结果。

同时打开两个命令提示符窗口,左边测试本地redis,右边测试本地garnet。理论上使用redis自己的压力测试工具,可能对garnet不是很公平,但是应该不慌。如果性能接近,那基本上可以确定garnet可以替代redis了。

先看第一个测试结果,服务器成功处理了100,000个 PING 请求,redis全部处理消耗1.92秒,garnet消耗2.17秒,redis胜一筹。redis 胜 garnet

第二个测试结果, PING_BULK 模式进行压力测试,完成了100,000个请求,redis耗时1.85秒,garnet耗时1.82秒,几乎差不多。redis 败 garnet

SET操作,Resis耗时1.97秒,garnet 耗时1.89秒,garnet略胜一筹。redis 败 garnet

GET操作,Redis耗时 1.9秒,garnet耗时 1.88秒,基本上接近。redis败garnet

Incr操作测试:redis败garnet

LPUSH操作,redis 败 garnet

RPUSH操作,Redis 败 Garnet

LPOP操作,Redis 败 Garnet

RPOP操作,Redis 胜 Garnet

SADD操作,Redis 败 Garnet

HSET操作,Redis 败 Garnet

SPOP 操作,平局

LPUSH操作,redis 败 garnet

LRANGE_100,redis 胜 garnet

LRANGE_300,redis 胜 garnet

LRANGE_500,redis 胜 garnet

MSET操作,redis 异常,garnet 胜

以上内容我做个汇总:

如果对garnet产品感兴趣,以及garnet的具体配置等,可以参考garnet的文档,以此来配置出一个更适合你的生产环境和更高性能的效果。garnet官方文档地址: https://microsoft.github.io/garnet/docs

0 人点赞