你是否正在使用 Redis 作为您的数据结构存储,享受它的高性能、高可用的特性?如果是这样,那么你可能会对 KeyDB 感兴趣。

什么是 KeyDB?

KeyDB 一个由 Snap 提供支持、专为扩展而构建的开源数据库。它是 Redis 的高性能分支,专注于多线程、内存效率和高吞吐量。KeyDB 采用 MVCC 体系结构,允许您执行 KEYS 和 SCAN 等查询,而不会阻塞数据库并降低性能。KeyDB 保持与 Redis 协议、模块和脚本的完全兼容性,这包括脚本和事务的原子性保证。由于 KeyDB 与 Redis 开发保持同步,KeyDB 是 Redis 功能的超集,这使得 KeyDB 成为现有 Redis 理想的替代品。

项目地址:https://docs.keydb.dev/
源码地址:https://github.com/Snapchat/KeyDB

KeyDB 独有特性

除了与 Redis 相同的功能外,KeyDB 还提供了一些独有的特性,例如:

  • 无阻塞架构:采用一种 MVCC 体系结构,允许你可以查询数据库的单个快照,从而避免阻塞 SCAN 和 KEYS 等调用。这样可以大规模并发调用此类查询,而不会降低现有工作负载的整体性能。
  • 跨区域主动复制:这是一种新的复制模式,允许你在多个主节点之间进行双向异步复制。这样可以实现跨区域的多主站支持,提高数据可用性和一致性,无需哨兵监视节点进行故障转移。
  • 子项过期:这是一种新的过期机制,允许你对集合中的成员设置过期时间。这样可以实现更细粒度的数据管理和清理。
  • TLS加密:这是一种新的安全机制,为你的数据提供 TLS(传输层安全)支持。KeyDB 的 TLS 性能是 Redis + TLS 的 7 倍,并且不需要任何额外的配置或证书。
  • JavaScript 模块:这是一种新的扩展机制,让你可以使用 JavaScript 来编写自定义的命令和逻辑。JavaScript 模块基于 V8 引擎构建,比 Lua 更快,并且支持许多 Node.js 模块。

KeyDB 性能测试

在同一硬件上,KeyDB 可以实现比 Redis 高得多的吞吐量。主动复制简化了热备盘故障切换,使你能够轻松地跨副本分布写入操作,并使用简单的基于 TCP 的负载平衡/故障转移。KeyDB 的更高性能允许你在更少的硬件上做更多的事情,从而降低运营成本和复杂性。

下图为Redis、TLS 和多线程 KeyDB 基准测试比较:

测试显示,在 Redis 6(单线程)上启用 TLS 的情况下,测量值下降了 36%。但是,如果你以前使用过 I/O 线程功能,则可能会看到性能下降 61%,因为使用 TLS 不支持 I/O 线程。

下图为Redis、TLS 和多线程 KeyDB 延迟基准测试比较(数值越低越好):

可以看到,使用 TLS 时,这些负载下的延迟明显更高。KeyDB 不仅在非常高的容量下提供服务,而且延迟也比使用 TLS 的 Redis 低 7 倍。

下图为使用 YCSB 对 Redis 6 多线程 I/O 与 Elasticache 和 KeyDB 进行吞吐量测试比较:

很明显,KeyDB 在每个测试的工作负载下都实现了最高的吞吐量。Elasticache 排在第二位,其次是 Redis 6。可以注意到,在没有 I/O 线程的情况下,Redis 6 仍然比版本5快。

下图为使用 YCSB 对 Redis 6 多线程 I/O 与 Elasticache 和 KeyDB 进行延迟测试比较(以微秒为单位,值越低越好):

上面显示的趋势表明,当实例接近其容量吞吐量时,延迟会显著增加。KeyDB 可以处理比 Redis 6 高得多的吞吐量,并且略高于 Elasticache,因此能够在更高的负载下保持较低的延迟。

KeyDB、Elasticache 和 Redis 6 在轻度到中等流量下都有类似的延迟。直到容量开始达到更高的负载,才能看到差异。

更多测试内容请移步这里查看:https://docs.keydb.dev/blog

如何使用 KeyDB?

由于 KeyDB 与 Redis完全兼容,使得它非常容易使用,我们可以像 Redis 一样来使用它。来做一个简单的示例,演示如何连接到 KeyDB,设置和获取一个字符串值,以及使用 EXPIREMEMBER 命令来设置子项过期。

KeyDB命令文档:https://docs.keydb.dev/docs/commands/#expiremember

首先,从 Docker Hub 拉取 KeyDB 的镜像并运行:

# 拉取 KeyDB 的镜像
docker pull eqalpha/keydb # 运行 KeyDB 的容器
docker run -p 6379:6379 -d eqalpha/keydb

然后,创建一个控制台应用程序,安装 StackExchange.Redis 库:

# 创建一个控制台应用程序
dotnet new console -o KeyDBDemo # 安装 StackExchange.Redis 库
nuget install StackExchange.Redis

然后,编辑 Program.cs 文件,添加以下代码:

using StackExchange.Redis;
public class KeyDBDemo
{
private static void Main(string[] args)
{
// 创建一个连接到本地Redis实例的连接器
ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("localhost");
// 获取一个数据库对象
IDatabase db = redis.GetDatabase(); // 设置一个字符串值,键为 "name",值为 "Bing"
db.StringSet("name", "Bing"); // 获取键为 "name" 的字符串值
var name = db.StringGet("name"); // 打印结果
Console.WriteLine($"The name is {name}"); // 设置一个集合值,键为 "fruits",值为 ["apple", "banana", "orange"]
db.SetAdd("fruits", new RedisValue[] { "apple", "banana", "orange" }); // 为集合中的成员 "apple" 设置过期时间为 5 秒
db.Execute("EXPIREMEMBER", "fruits", "apple", 5); // 获取键为 "fruits" 的集合值
var fruits = db.SetMembers("fruits"); // 打印结果
Console.WriteLine($"The fruits are {string.Join(", ", fruits)}"); // 等待 5 秒后,再次获取键为 "fruits" 的集合值
Thread.Sleep(5100);
fruits = db.SetMembers("fruits"); // 打印结果
Console.WriteLine($"The fruits are {string.Join(", ", fruits)}"); // 关闭连接
redis.Close();
}
}

最后,运行程序,可以得到以下结果:

The name is Bing
The fruits are banana, apple, orange
The fruits are banana, orange

写作不易,转载请注明文章出处,否则禁转!!!

感谢阅读,点赞+分享+收藏+关注
文章出自猿惑豁微信公众号

Redis的速度不够用?为什么你应该考虑使用 KeyDB,一个更快、更强大、更灵活的开源数据库的更多相关文章

  1. 比Redis更快:Berkeley DB面面观

    比Redis更快:Berkeley DB面面观 Redis很火,最近大家用的多.从两年前开始,Memcached转向Redis逐渐成为潮流:而Berkeley DB可能很多朋友还很陌生,首先,我们简单 ...

  2. 你的以太网速度足够快吗?四种更快的速度正在路上······

    以太网的未来将远远超越下一个最快速度:为无处不在的网络协议绘制路径的网络project师们正在寻找新版本号来服务于各种应用程序. 在上周六的以太网联盟(一个行业组织,用于促进IEEE以太网标准)会议上 ...

  3. 超越halcon速度的二值图像的腐蚀和膨胀,实现目前最快的半径相关类算法(附核心源码)。

    我在两年前的博客里曾经写过 SSE图像算法优化系列七:基于SSE实现的极速的矩形核腐蚀和膨胀(最大值和最小值)算法  一文,通过SSE的优化把矩形核心的腐蚀和膨胀做到了不仅和半径无关,而且速度也相当的 ...

  4. 更快的Maven来了,我的天,速度提升了8倍!

    周末被 maven-mvnd 刷屏了,于是我也下载了一个 mvnd 体验了一把.虽然测试的数据都是基于我本地项目,不具备普适性和权威性,但也足以说明问题.它的测试结果远远超出我的预期,下面一起来看. ...

  5. Go1.7改善了编译速度并且会生成更快的代码

    Go1.7的开发周期正在接近它的下一个里程碑,Go的提交者Dave Cheney报告了子即将发布的版本中,团队成员在语言工具链上的努力. Cheney称,基于当前的开发状态,Go1.7将会很容易就成为 ...

  6. JQuery动画插件Velocity.js发布:更快的动画切换速度

    5月3日,Julian在其GitHub上发布了Velocity.js.Velocity.js是一款动画切换的jQuery插件,它重新实现了jQuery的$.animate()方法从而加快动画切换的速度 ...

  7. Velocity.js发布:更快的动画切换速度

    Velocity.js是一款动画切换的jQuery插件,它重新实现了jQuery的$.animate()方法从而加快动画切换的速度.Velocity.js只有7k的大小,它不仅包含了$.animate ...

  8. 我发起了一个 .Net Core 平台上的 分布式缓存 开源项目 ShareMemory 用于 取代 Redis

    Redis 的 安装 是 复杂 的, 使用 是 复杂 的, Redis 的 功能 是 重型 的, Redis 本身的 技术实现 是 复杂 的 . Redis 是用 C 写的, C 语言 编写的代码需要 ...

  9. 更快的速度、更好的服务——易普优APS云排程

    众所周知软件执行效率受制于硬件性能,市面上的APS产品多为单机版本,企业要应用好APS,保证紧急插单.计划下发全程无忧,用户电脑硬件性能是不容忽视的一大瓶颈.APS的直接用户是车间管理人员.计划员,而 ...

  10. 谷歌Chrome 27测试版已经发布 更快的浏览速度

    谷歌已经发布了Chrome 27测试版浏览器,为普通用户带来了大约提升为5%的网页浏览速度.用户已经可以在Chrome测试网页下载到最新的更新了.我们已经对这版更新做了一个全面的快速测试,让我们看看究 ...

随机推荐

  1. Apache Hudi 元数据字段揭秘

    介绍 Apache Hudi 最初由Uber于 2016 年开发,旨在实现一个交易型数据湖,该数据湖可以快速可靠地支持更新,以支持公司拼车平台的大规模增长. Apache Hudi 现在被业内许多人广 ...

  2. ASP.NET MVC4 学习笔记-2

    渲染网页-Randering Web Pages 前面示例的输出结果不是HTML,而是一个"Hello World"的字符串.为了响应浏览器的请求产生一个HTML网页,我们需要创建 ...

  3. 深入JS——理解闭包可以看作是某种意义上的重生

    JS中有一个非常重要但又难以完全掌握的概念,那就是闭包.很多JS程序员自以为已经掌握了闭包,但实质上是一知半解,就像"JS中万物皆为对象"这个常见的错误说法一样,很多前端开发者到现 ...

  4. Valine评论插件因为LeanCloud国内域名解析问题无法正常使用的解决方法

    近日,LeanCloud 国内域名解析存在问题,Valine评论插件的评论内容都储存在LeanCloud,使用Valine评论插件的个人博客的评论及阅读数会显示失败. 关于 LeanCloud 国内域 ...

  5. webshell工具流量特征

    常见的webshell管理工具及流量特征 菜刀 作为老牌 Webshell 管理神器,中国菜刀的攻击流量特征明显,容易被各类安全设备检测,实际场景中越来越少使用,加密 Webshell 正变得日趋流行 ...

  6. 我真的,AI框架的编程范式怎么理解?

    我给领导汇报AI框架用函数式编程好,没讲明白,说函数式就是写函数那样方便,都被领导吊飞了,啥玩意,写啥不是写函数,狗屁不通! 网上搜说用tensorflow那就是用声明式编程,用pytorch就是命令 ...

  7. openpyxl 设置单元格自动换行

    解决方案 openpyxl的alignment函数中的参数:wrapText=True,就可以了 from openpyxl.styles import Alignment worksheet.cel ...

  8. 不要再傻傻分不清 hash、 chunkhash 和 contenthash 啦

    hash.contenthash 和 chunkhash 是通过散列函数处理之后,生成的一串字符,可用于区分文件. 文件名不带哈希值 webpack.config.js 文件中,output 中定义输 ...

  9. 云原生可观测框架 OpenTelemetry 基础知识(架构/分布式追踪/指标/日志/采样/收集器)

    什么是 OpenTelemetry? OpenTelemetry 是一个开源的可观测性框架,由云原生基金会(CNCF)托管.它是 OpenCensus 和 OpenTracing 项目的合并.旨在为所 ...

  10. Python字符串操作函数split()和join()

    字符串拆分 在python中有切片(Slice)操作符,可以对字符串进行截取,还提供了split()函数可以将一个 字符串分裂成多个字符串组成的列表.在使用split()函数来拆分字符串之前,我们先来 ...