微软开源项目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 的源码克隆到本地:

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 平台的示例命令:

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 客户端库:

dotnet add package StackExchange.Redis

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

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可能是一个不错的选择。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/772781.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阿里云子域名配置,且不带端口访问

进入阿里云控制台,创建一个SSL证书 # 域名名称child.domain.com创建完成后,将返回主机记录以及记录值,保存好,用于下一步使用 创建DNS解析 创建DNS的TXT类型解析 选择记录类型:TXT 填写主机记录:_dnsa…

一些常见的与 Vim 相关的文件类型及其描述

配置文件: .vimrc (Unix/Linux) 或 _vimrc (Windows):这是 Vim 的主要配置文件,用户可以在其中设置各种选项、快捷键映射、插件加载等。Vim 在启动时会自动读取这个文件,并根据其中的设置来配置编辑器。init.vim:对于 …

【CSP试题回顾】202104-2-邻域均值(优化)

CSP-202104-2-邻域均值 关键点:二维前缀和数组 详见: 【CSP考题扩展】前缀和/差分练习【CSP考点回顾】二维前缀和数组(代码实现) 解题思路 1.输入和初始化 首先,程序从输入中获取四个整数n(矩阵的大小…

排序(冒泡/快速/归并)

冒泡排序 时间复杂度为 O(n^2) 原理 比较相邻的元素. 如果第一个比第二个大,就交换他们两个.依次比较每一对相邻的元素—>结果 : 最后的元素是这组数中最大的重复上述步骤 , 除了最后一个[]因为最后一个已经是排好序的了(这组数中最大的那个)]持续对越来越少的元素进行如上…

系列学习前端之第 7 章:一文掌握 AJAX

1、AJAX 简介 AJAX 全称为 Asynchronous JavaScript And XML(中文名:阿贾克斯),就是异步的 JS 和 XML。AJAX 不是新的编程语言,而是一种将现有的标准组合在一起使用的新方式。AJAX 可以在浏览器中向服务器发送异步请求…

docker拉取镜像

docker 拉取镜像 命令格式 docker pull 仓库名称[:标签] 从下载过程可以看出: (1)镜像文件是由若干层组成,即:AUFS联合文件系统。这是实现增量保存与更新的基础 (2)下载过程会输出各层镜像的信…

面试题-Elasticsearch集群架构和调优手段(超全面)

对于Elasticsearch(ES),我了解并有经验。在我之前的公司,我们有一个相对大型的ES集群,以下是该集群的架构和一些调优手段的概述: 1. 集群架构 集群规模:我们的ES集群由15个节点组成&#xff0c…

水果店如何开发自己的微信小程序_新鲜生活,触手可及

水果店微信小程序:新鲜生活,触手可及 在这个快节奏的时代,我们都在追求更高效、更便捷的生活方式。而微信小程序,正是这样一个让生活变得更加轻松便捷的神奇工具。今天,我要向大家介绍的,就是一家独具匠心…

独享IP可以避免被封禁或限制访问的风险

在一些网站或服务中,存在对共享IP的封禁或限制访问的情况,这给用户带来了不便。而使用独享IP可以有效规避这一问题,保障用户正常访问需求。例如,在进行搜索引擎优化、社交媒体营销或广告投放时,独享IP可以确保用户的网…

window下迁移SVN仓库到新的windows服务器

一、背景 一个基于 Windows 的 SVN 服务器,用于管理团队的代码库。该 SVN 仓库托管着公司的软件项目,包括多个分支和版本的代码。我们的团队规模约为 50 人,分布在不同的地理位置,他们都依赖 SVN 仓库来进行代码版本控制和协作开…

LeetCode146:LRU缓存

leetCode:146. LRU 缓存 题目描述 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类: LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存 int get(int key) 如果关键字 key 存在于缓存中&#x…

微服务(基础篇-005-Gateway)

目录 Gateway介绍: 为什么需要网关(1) gateway快速入门(2) 断言工厂(3) 过滤器工厂(4) 过滤器工厂介绍及案例(4.1) 默认过滤器&#xff08…

IMac、Chrome、vim、pycharm的常用快捷键和常用开发工具homebrew

mac系统 陌生按键 用惯了windows的uu们(譬如本人)刚开始接触时可能就看不懂以下按键,多看几遍就好了 ⌘ (Command / Cmd) ⌥ (Option) ⌃ (control) ⇧ (shift) ⏏️ (Eject) 《关闭应用程序CommandQ》和《关闭应用界面CommandW》 comman…

C#进阶-反射的详解与应用

一、反射的概念 反射是.NET框架提供的一个功能强大的机制,它允许程序在运行时检查和操作对象的类型信息。通过使用反射,程序可以动态地创建对象、调用方法、访问字段和属性,无需在编译时显式知道类型信息。在.NET中,所有类型的信…

【STL学习】(2)string的模拟实现

前言 本文将模拟实现string的一些常见功能,目的在于加深理解string与回顾类与对象的相关知识。 一、前置知识 string是表示可变长的字符序列的类string的底层是使用动态顺序表存储的string对象不以’\0’字符为终止算长度,而是以size有效字符的个数算长…

华为openGauss数据库全面解读:数据类型一览与实战指南

引言: 华为openGauss数据库作为一款优秀的国产企业级数据库产品,其丰富多样的数据类型设计为多样化的业务场景提供了强大的数据存储与处理能力。本文将深入浅出地介绍openGauss支持的主要数据类型,并辅以实际应用案例,帮助读者更…

分布式系统面试全集通第一篇(dubbo+redis+zookeeper----分布式+CAP+BASE+分布式事务+分布式锁)

目录 分布式系统面试全集通第一篇什么是分布式?和微服务的区别什么是分布式分布式与微服务的区别 什么是CAP?为什么不能三者同时拥有分区容错性一致性可用性 Base理论了解吗基本可用软状态最终一致性 什么是分布式事务分布式事务有哪些常见的实现方案?2PC(Two Ph…

2024-03-26 Android8.1 px30 WI-FI 模块rtl8821cu调试记录

一、kernel 驱动,我这里使用v5.8.1.2_35530.20191025_COEX20191014-4141这个版本,下载这个版本的驱动可以参考下面的文章。 2021-04-12 RK3288 Android7.1 USB wifi bluetooth 模块RTL8821CU 调试记录_rk平台rtl8821cu蓝牙调试-CSDN博客 二、Makefile文…

vue 复制到剪切板 公共方法组件 clipboard 第一次没反应第二次成功

背景:使用clipboard时候想提出组件,后续发现第一次没反应第二次成功 原理:clipboard是创建一个dom监听,然后点击dom时候复制并触发回调函数。所以第一次点击时候是创建监听,第二次点击才能被监听到 解决方案&#xff1…

KY228 找位置(用Java实现)

描述 对给定的一个字符串,找出有重复的字符,并给出其位置,如:abcaaAB12ab12 输出:a,1;a,4;a,5;a,10,b,2&…