你是否正在使用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基准测试比较:
测试显示,在Redis6(单线程)上启用TLS的情况下,测量值下降了36%。但是,如果你以前使用过I/O线程功能,则可能会看到性能下降61%,因为使用TLS不支持I/O线程。
下图为Redis、TLS和多线程KeyDB延迟基准测试比较(数值越低越好):
可以看到,使用TLS时,这些负载下的延迟明显更高。KeyDB不仅在非常高的容量下提供服务,而且延迟也比使用TLS的Redis低7倍。
下图为使用YCSB对Redis6多线程I/O与Elasticache和KeyDB进行吞吐量测试比较:
很明显,KeyDB在每个测试的工作负载下都实现了最高的吞吐量。Elasticache排在第二位,其次是Redis6。可以注意到,在没有I/O线程的情况下,Redis6仍然比版本5快。
下图为使用YCSB对Redis6多线程I/O与Elasticache和KeyDB进行延迟测试比较(以微秒为单位,值越低越好):
上面显示的趋势表明,当实例接近其容量吞吐量时,延迟会显著增加。KeyDB可以处理比Redis6高得多的吞吐量,并且略高于Elasticache,因此能够在更高的负载下保持较低的延迟。
KeyDB、Elasticache和Redis6在轻度到中等流量下都有类似的延迟。直到容量开始达到更高的负载,才能看到差异。
更多测试内容请移步这里查看:https://docs.keydb.dev/blog
如何使用KeyDB?
由于KeyDB与Redis完全兼容,使得它非常容易使用,我们可以像Redis一样来使用它。来做一个简单的示例,演示如何连接到KeyDB,设置和获取一个字符串值,以及使用EXPIREMEMBER命令来设置子项过期。
KeyDB命令文档:https://docs.keydb.dev/docs/commands/#expiremember
首先,从DockerHub拉取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
写作不易,转载请注明文章出处,否则禁转!!!
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net
相关推荐: SpringBoot自动装配什么是自动装配?如何实现自动装配?自动装配的优势总结
Spring Boot 是一个基于 Spring 框架的开源框架,它简化了 Spring 应用的开发和部署,使得开发人员可以更加专注于业务逻辑的实现。其中一个重要的特性就是自动装配。 什么是自动装配? 自动装配是 Spring Boot 中的一个重要特性,它可…