微软开源项目Garnet:Redis的竞争者还是替代者?

对于开源社区,最近的一大新闻就是Redis宣布从7.4版本开始,将采用Redis源代码可用许可证(RSALv2)和服务器端公共许可证(SSPLv1)的双重许可证,取代原有的BSD三条款许可证。这一变化引发了开发者社区的热烈讨论,同时也为微软的新开源项目Garnet带来了更多的关注。那么,Garnet究竟是什么?它与Redis有何关系?让我们一起来探讨。

1. Garnet是什么?

Garnet是微软研究院的新开源项目,它是一个远程缓存存储,提供了一系列独特的优势。Garnet采用了Redis的RESP协议作为起点,这使得开发者可以使用大多数编程语言中现成的Redis客户端,例如 .NET 中的StackExchange.Redis,来使用Garnet。相比于其他开源缓存存储,Garnet在性能、延迟、可扩展性和持久性方面有显著的提升。

2. Garnet的特点

Garnet的特点可以概括为以下几点:

  1. 兼容性:Garnet采用了RESP协议,这使得它可以与大多数现有的Redis客户端无缝对接。

  2. 高性能:Garnet提供了更好的吞吐量和可扩展性,尤其在处理大量客户端连接和小批量数据时,相比于其他开源缓存存储,Garnet的性能有显著提升。

  3. 低延迟:Garnet在普通云(例如Azure)虚拟机上,使用加速TCP,可以实现极低的客户端延迟,这对于实际应用场景至关重要。

  4. 跨平台:Garnet基于最新的.NET技术,可以在Linux和Windows上运行,同时,它也非常易于开发和扩展,而不会牺牲性能。

  5. 丰富的API:Garnet实现了一系列API,包括原始字符串操作(例如gets、sets和key expiration)、分析操作(例如HyperLogLog和Bitmap)、对象操作(例如sorted sets和lists)等。此外,它还支持用户定义自定义操作,降低了开发自定义扩展的难度。

  6. 安全性:Garnet支持使用.NET的SslStream库进行安全的传输层安全(TLS)通信,同时提供基本的访问控制。

  7. 持久性和可恢复性:Garnet的存储层,称为Tsavorite,支持线程可扩展性、分层存储(内存、SSD和云存储)、快速非阻塞检查点、恢复、操作日志记录以及多键事务支持等强大的数据库功能。

  8. 集群模式:Garnet支持集群模式,可以进行分片、复制和动态键迁移。

3. Garnet与Redis的关系

Garnet并非是要取代Redis,而是提供了一个与Redis兼容的、具有一些独特优势的选择。与Redis不同的是,Garnet是基于.NET技术构建的,这使得它在性能和可扩展性上有所提升,同时也使得它更易于开发和扩展。

在Redis宣布许可证变更的同时,微软发布了Garnet,这无疑给开发者社区提供了一个新的选择。对于那些不希望或无法接受Redis新的许可证政策的用户,Garnet可能是一个不错的替代方案。

4. Garnet的部署和使用

Garnet 开源地址:https://github.com/microsoft/garnet?WT.mc_id=DT-MVP-5005195 。开发者可以通过该地址获取Garnet的源代码,并了解更多关于Garnet的信息。

4.1 服务部署

Garnet的服务部署非常简单,Garnet是基于.NET技术构建的,也提供了多种部署方式供开发者灵活的选择。你可以直接将其作为独立的服务自行编译部署,也可以通过 Nugget 包的方式引入并集成到你的项目中,当然官方也贴心的提供了多种 Dockerfile 方便开发者快速部署。这里我们简单介绍一下如何编译并运行 Garnet 服务和如何通过客户端使用。

4.1.1 源码构建

首先,你需要安装 .NET SDK,然后通过 Git 将 Garnet 的源码克隆到本地:

shell 复制代码
git clone git@github.com:microsoft/garnet.git
cd garnet
dotnet restore
cd main/GarnetServer
dotnet run -c Release -f net8.0

通过上面的命令我们即可快速的启动一个 Garnet 服务,默认情况下,Garnet 侦听 TCP 端口 3278。

当然我们也可以编译成一个独立的可执行文件,以下是编译 win-x64 平台的示例命令:

shell 复制代码
dotnet publish -c Release -f net8.0 -r win-x64 -o=publish/win-x64 -p:PublishSingleFile=true -p:PublishTrimmed=true

4.1.2 客户端使用

使用 Garnet 的客户端非常简单,只需要按照 Redis 客户端库的使用方式无缝切换即可。这里我们以 C# 为例,使用 StackExchange.Redis 客户端库来连接 Garnet 服务。

首先,我们需要安装 StackExchange.Redis 客户端库:

shell 复制代码
dotnet add package StackExchange.Redis

然后,我们可以通过以下代码来连接 Garnet 服务并进行操作:

csharp 复制代码
using System;
using StackExchange.Redis;

class Program
{
    static void Main(string[] args)
    { 
        var connection = ConnectionMultiplexer.Connect("localhost:3278");
        var db = connection.GetDatabase();

        db.StringSet("key", "value");
        var value = db.StringGet("key");

        Console.WriteLine(value);
    }
}

以上只是简单的使用,如果你需要集群等更复杂的配置,请查阅官方文档

5. 兼容性

需要注意的是,Garnet虽然兼容Redis的RESP协议,但并不是完全兼容Redis的所有功能。在使用Garnet时,开发者需要注意一些细节,例如Garnet不支持Redis的一些命令、数据结构和特性,这可能会对一些应用场景造成影响。因此,在使用Garnet时,开发者需要根据自己的实际需求进行选择。具体的兼容性问题,可以参考Garnet的官方文档关于兼容性的描述

6. 结论

作为微软的新开源项目,Garnet无疑为开发者社区带来了新的可能性。它的出现并非要取代Redis,而是提供了一个与Redis兼容的、具有一些独特优势的选择。对于开发者来说,Garnet的出现无疑为他们提供了更多的选择,而这对于开源社区的发展来说,无疑是一件好事。如果你正在寻找一个Redis的替代方案,那么Garnet可能是一个不错的选择。

相关推荐
带娃的IT创业者2 小时前
Valve 开源 Steam Controller:当硬件设计遇上开源精神,一场游戏外设的革命才刚刚开始
游戏·开源·开源硬件·cad·知识共享·valve·游戏外设
庞轩px3 小时前
第四篇:RDB与AOF持久化——宕机后数据怎么恢复?
redis·缓存·持久化·aof·rdb·宕机·恢复数据
计算机魔术师3 小时前
【技术趣闻 | AI Agent Skill】为什么 AI 总绕着同一个脑回路转?多语言思维采样:让 Agent 从“给一个答案”变成“给一组方案”
开源
PeterLi3 小时前
Redis 分布式锁架构全解析:从基础实现到生产级选型指南
redis·分布式
下次再写4 小时前
【Redis实战】深入理解Redis缓存策略:从原理到Spring Boot实践
java·spring boot·redis·缓存穿透·缓存击穿·分布式缓存·缓存策略
千桐科技4 小时前
qKnow 智能体构建平台开源版 2.1.0 正式发布:AI编排能力重磅升级,打造一站式私有化智能平台
人工智能·开源·大模型·ai应用·qknow·智能体构建平台·ai编排
Luca_kill5 小时前
深度解析 Vercel Open Agents:三层分离架构如何让 AI 编码进入“后台运行“时代
开源·架构设计·ai agent·vercel·open agents
li星野5 小时前
哈希表通关八题:从两数之和到LRU缓存,手撕高频面试题(Python + C++)
python·缓存·散列表
小白君6535 小时前
互联网大厂Java面试:从Spring Boot到微服务的技术场景深度解析
spring boot·redis·微服务·消息队列·java面试·数据库优化
庞轩px5 小时前
第七篇:Redis分布式锁——从setnx到RedLock的演进之路
数据库·redis·分布式锁·redission·setnx·redlock·可重入锁