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

news2024/11/20 20:30:28

对于开源社区,最近的一大新闻就是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.coloradmin.cn/o/1547269.html

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

相关文章

前端日期组件layui使用,月模式

初学前端,实战总结 概要 有一个日期组件,我的谷歌浏览器选完日期后,偶尔获取不到最新数据,有一个客户,是经常出不来数据。 日期组件是Wdate:调用的方法是WdatePicker onpicking,代码片段如下…

基于Python实现多功能翻译助手(下)

为了将上述步骤中的功能增强与扩展具体化为代码,我们将实现翻译历史记录功能、翻译选项配置以及UI的改进。 翻译历史记录功能 import json # 假设有一个用于存储历史记录的json文件 HISTORY_FILE translation_history.json # 初始化历史记录列表 translati…

HarmonyOS网格布局:List组件和Grid组件的使用

简介 在我们常用的手机应用中,经常会见到一些数据列表,如设置页面、通讯录、商品列表等。下图中两个页面都包含列表,“首页”页面中包含两个网格布局,“商城”页面中包含一个商品列表。 上图中的列表中都包含一系列相同宽度的列表…

【Unity人机交互】人工智能之爬虫开章

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:Uni…

如何使用WordPress插件保护网站的安全

前段时间我们的网站受到了黑客的攻击,网站丢失了一些重要的数据,为了防止这种情况的再次发生,我们准备将网站全部迁移到高防服务器,经过一番对比后,我们选择了Hostease提供的高防服务器。它可以有效地抵御各种类型的网…

存内计算:释放潜能的黑科技

什么是存内计算? 存内计算技术是一种新型的计算架构,它将存储器和计算单元融合在一起,以实现高效的数据处理。存内计算技术的优势在于能够消除数据搬运的延迟和功耗,从而提高计算效率和能效比。目前,存内计算技术正处…

Web APIs知识点讲解(阶段三)

DOM- 节点操作 一.节点操作 1.DOM节点 目标:能说出DOM节点的类型 DOM节点 DOM树里每一个内容都称之为节点 节点类型 元素节点 所有的标签 比如 body、 div html 是根节点 属性节点 所有的属性 比如 href 文本节点 所有的文本 document树: 总结&…

代码随想录 Day58 单调栈

今天新学了单调栈,个人感觉蛮简单,只是在栈的基础上加了一条限制条件(即递增或递减)

苹果Find My产品需求增长迅速,伦茨科技ST17H6x芯片供货充足

苹果的Find My功能使得用户可以轻松查找iPhone、Mac、AirPods以及Apple Watch等设备。如今Find My还进入了耳机、充电宝、箱包、电动车、保温杯等多个行业。苹果发布AirTag发布以来,大家都更加注重物品的防丢,苹果的 Find My 就可以查找 iPhone、Mac、Ai…

智能调度架构:优化资源分配,提升效率

随着人工智能技术的发展和应用,智能调度架构作为一种新兴的技术方案,正逐渐成为各行业优化资源分配、提升效率的重要工具。本文将深入探讨智能调度架构的意义、原理以及在不同领域的应用场景。 ### 什么是智能调度架构? 智能调度架构是指基…

算法---动态规划-3(解码方法)

解码方法 1. 题目解析2. 讲解算法原理3. 编写代码 1. 题目解析 题目地址:点这里 2. 讲解算法原理 首先,通过字符串s的大小确定字符串的长度为n,并创建一个长度为n的动态规划数组dp。 处理特殊情况:如果字符串s的长度为1&#xf…

《量子计算:揭开未来科技新篇章》

随着科技的不断发展,量子计算作为一项颠覆性的技术逐渐走进人们的视野,引发了广泛的关注和探讨。本文将围绕量子计算的技术进展、技术原理、行业应用案例、未来趋势预测以及学习路线等方向,深入探讨这一领域的前沿动态和未来发展趋势。 量子…

基于nodejs+vue健身俱乐部网站python-flask-django-php

随着社会的发展,健身俱乐部的管理形势越来越严峻。越来越多的用户利用互联网获得信息,健身信息鱼龙混杂,信息真假难以辨别。为了方便用户更好的获得本健身俱乐部管理信息,因此,设计一种安全高效的健身俱乐部网站极为重…

Uniapp三种常用提示框

具体参数方法可参考: uniapp交互反馈 uni.showToast(OBJECT) //显示消息提示框。 uni.hideToast() //隐藏消息提示框。 //具体使用 uni.showToast({title: 新增成功,duration: 2000 }); uni.showLoading(OBJECT) //显示 loading 提示框, 需主动调用 uni.hideLoading 才能关闭提…

GitLab更新失败(CentOS)

使用yum更新GitLab,出现如下错误提示: Error: Failed to download metadata for repo gitlab_gitlab-ce: repomd.xml GPG signature verification error: Bad GPG signature 编写如下脚本: for pubring in /var/cache/dnf/gitlab_gitlab-?…

【排序算法】深入解析快速排序(霍尔法三指针法挖坑法优化随机选key中位数法小区间法非递归版本)

文章目录 📝快速排序🌠霍尔法🌉三指针法🌠挖坑法✏️优化快速排序 🌠随机选key🌉三位数取中 🌠小区间选择走插入,可以减少90%左右的递归🌉 快速排序改非递归版本&#x1…

图论最短路径以及floyd算法的MATLAB实现

图论是数学的一个分支,起源于18世纪。1736年,数学家欧拉通过解决“哥尼斯堡七桥问题”,将问题抽象成点和线的关系,并通过理论分析得出结论,这个过程标志着图论的产生,欧拉也因此被称为“图论之父”。图论研…

pandas 函数

pandas是基于numpy数组构建的,但二者最大的不同是pandas是专门为处理表格和混杂数据设计的,比较契合统计分析中的表结构,而numpy更适合处理统一的数值数组数据。pandas数组结构有一维Series和二维DataFrame。 Series的字符串表现形式为&#…

Nacos安装指南(包含Windows、Linux、Mac安装指南)

Nacos安装指南 1.Windows安装 开发阶段采用单机安装即可。 1.1.下载安装包 在Nacos的GitHub页面,提供有下载链接,可以下载编译好的Nacos服务端或者源代码: GitHub主页:https://github.com/alibaba/nacos GitHub的Release下载…

Web APIs 学习知识总结

渲染学成在线案例 html文件: <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta http-equiv"X-UA-Com…