NoSQL佼佼者:选出最好的键值数据库

Aerospike,Hazelcast,Memcached,Microsoft Azure Cosmos DB和Redis对数据存储方式进行了不同的改进。

NoSQL佼佼者:选出最好的键值数据库

大多数应用程序对相关数据需要某种形式的持久性:一种将数据存储在应用程序外部以便安全保存的方法。最基本的方法是将数据写入文件系统,但这很快就成为一种缓慢而笨拙的方法。有时,您需要的只是一种快速获取自由格式信息的方法。

键值存储。它本质上是一种NoSQL数据库,但具有高度特定的目的和故意限制的设计。它的工作是让你获取数据(一个值),为它(一个键)添加一个标签,并将其存储在内存中或存储系统中,该系统已经过优化,可以快速检索。应用程序使用键值数据库来处理从缓存对象到在应用程序节点之间共享常用数据的所有内容。

许多关系数据库可以作为键值存储,但这有点像使用拖拉机拖车去杂货店运行。它有效,但效率极低,并且有更轻松的方法来解决问题。与其他NoSQL数据库一样,键值存储为简单的价值存储和检索提供了足够的基础架构,可以更直接地与使用它的应用程序集成,并以更细粒度的方式扩展应用程序工作负载。

一、键值NoSQL数据库功能比较

五种广泛使用的产品(包括一种云服务)值得您考虑; 它们被明确地称为键值数据库,或者提供键值存储作为核心功能。他们的基本差异:

l Hazelcast和Memcached倾向于极简主义,甚至懒得备份磁盘上的数据。

l Aerospike,Cosmos DB和Redis功能更全面,但是仍然围绕着键值存储。

NoSQL佼佼者:选出最好的键值数据库
二、深入Aerospike

与Redis一样,Aerospike是一个键值存储,可以作为持久数据库或数据缓存运行。Aerospike旨在易于集群和易于扩展,以更好地支持企业工作负载。

Aerospike独有的特色

Aerospike的很多内容与其他键值存储和其他NoSQL数据库相呼应。通过密钥存储和检索数据,并且数据可以保存在许多基本数据类型中,包括64位整数,字符串,双精度浮点数和从许多通用编程语言序列化的原始二进制数据。

Aerospike还可以将数据存储在复杂类型 – 值列表,称为映射的键值对集合以及GeoJSON格式的地理空间数据中。

存储在Aerospike中的数据可以组织成几个分层容器。一些NoSQL系统是面向文档的,这意味着数据被封装在某种对象中,通常是JSON。使用Aerospike,容器大致类似于文档,但具有Aerospike特有的功能和行为。每种容器都允许您在其中的数据上设置不同的行为属性。

Aerospike如何处理存储和群集

Aerospike几乎可以将数据保存在任何文件系统上,但它专门用于利用SSD。也就是说,不要指望将Aerospike放在任何旧SSD上,并期望取得良好效果。Aerospike的开发人员维护了一系列已批准的SSD设备,他们创建了一个名为ACT的工具,用于评估Aerospike工作负载下SSD存储设备的性能。

与大多数NoSQL系统一样,Aerospike为了复制和集群而使用无共享架构。Aerospike没有主节点,也没有手动分片。每个节点都是相同的。数据在节点之间随机分布,并自动重新平衡以防止形成瓶颈。如果需要,可以设置重新平衡数据的规则。您可以配置在不同网段或甚至不同数据中心运行的多个群集,以便彼此同步。

在Aerospike中编写脚本

与Redis一样,Aerospike允许开发人员编写在Aerospike引擎内运行的Lua脚本或UDF(用户定义的函数)。您可以使用UDF来读取或更改记录,但最好使用它们跨多个节点上的记录集合或“流”执行高速,只读,映射减少操作。

哪里可以获得Aerospike

Aerospike的社区版可以直接从Aerospike的网站下载。这包括适用于Linux的服务器版本,适用于Apple MacOS和Microsoft Windows的桌面版本,适用于Amazon EC2,Azure和Google Compute Engine的云版本以及Docker容器。Aerospike的企业版可通过Aerospike的快速启动计划获得,该计划提供无限制的90天试用版。

源代码可在GitHub上获得。

三、深入Hazelcast

Hazelcast被称为“内存数据网格”,实质上是一种跨多台计算机汇集RAM和CPU资源的方法,允许数据集分布在这些计算机上并在内存中进行操作。

NoSQL数据库提供键值,图形或文档功能。Hazelcast专注于键值功能,强调快速访问分布式数据。据其制造商称,它还可以用作Pivotal Gemfire,SoftwareTerracotta和Oracle Coherence等产品的替代品。

Hazelcast可以作为分布式服务运行,也可以直接嵌入Java应用程序中。客户端可用于Java,Scala,.Net,C / C ++,Python和Node.js,而Go正在开发中。

Hazelcast独有的功能

Hazelcast使用Java构建,具有以Java为中心的生态系统。Hazelcast集群中的每个节点都在JVM上运行Hazelcast核心库IMDG的实例。Hazelcast如何处理数据也与Java的语言结构紧密相关。例如,Java的Map接口被Hazelcast用于提供键值存储。与Memcached一样,没有任何内容写入磁盘;一切都保存在内存中。

Hazelcast可以在分布式环境中提供的一个好处是“接近缓存”,其中通常请求的对象被迁移到发出请求的服务器。这样,可以在同一系统上直接在内存中执行请求,而无需跨网络往返。

除了键值对,您还可以通过Hazelcast存储和分发许多其他类型的数据结构。有些是Java对象的简单实现,比如Map。其他特定于Hazelcast。例如,MultiMap是键值存储的变体,可以在同一个键下存储多个值。这些功能可以模拟其他NoSQL系统的某些行为,例如将数据组织到文档中,但是这种结构允许数据快速分发和访问。

Hazelcast如何处理群集

Hazelcast集群没有主/从设置; 一切都是点对点的。数据自动分片并分布在群集的所有成员中。您还可以将某些集群成员指定为“lite”,它最初不保留任何数据,但稍后可以提升为完整成员。这使得一些节点可以严格用于计算,或者在群集上线时逐渐通过群集分发数据。

Hazelcast还可以确保仅在至少一定数量的节点在线时才进行操作。但是,您必须手动配置此行为,并且它仅适用于某些数据结构。从Hazelcast版本3.9开始,您可以在群集中重新配置数据结构,而无需先使其脱机。

哪里可以获得Hazelcast

Hazelcast可直接从Hazelcast网站下载。它通常部署为Java .JAR文件的集合。Docker图像也可以在官方Docker注册表中找到。

您可以直接从Hazelcast下载Hazelcast的企业版。您还可以获得Hazelcast的30天免费试用密钥。

四、Memcached键值NoSQL数据库深入

Memcached与key-value存储一样简单和快速。Memcached最初是作为博客平台LiveJournal的加速层编写的,后来成为Web技术堆栈中无处不在的组件。如果您有许多可以与简单密钥关联的小数据片段,并且不需要在缓存实例之间复制,则Memcached是正确的工具。

Memcached独有的功能

Memcached最常用于缓存来自数据库的查询并将结果专门保存在内存中。在这方面,它与许多其他NoSQL数据库,键值或其他方式不同,因为它们以某种持久的形式存储数据。

Memcached没有持久化。只保存在内存中,因此只要重置Memcached实例或托管它的服务器,它们就会消失掉。因此,Memcached实际上不能用作NoSQL数据库的替代品。

但是,它是用来存储常用数据的高速方法。

可以序列化为二进制流的任何数据都可以存储在Memcached中。通过引用应用程序中的值的键,可以将值设置为在一定时间后或按需过期。您为任何给定的Memcached实例投入的内存量完全取决于您,并且多个服务器可以并行运行Memcached以分散负载。此外,Memcached与系统中可用的核心数量成线性比例,因为它是一个多线程应用程序。

大多数流行的编程语言都有Memcached的客户端库。例如,libmemcached允许C和C ++程序直接使用Memcached实例。它还可以将Memcached嵌入到C程序中。

Memcached如何处理群集

即使您可以运行多个Memcached实例,无论是在同一服务器上还是在网络上的多个节点上,实例之间都没有自动联合或数据同步。插入到Memcached实例中的数据仅可从该实例中获取。

哪里可以获得Memcached

Memcached的源代码可从GitHub和官方Memcached站点下载。大多数Linux发行版的存储库中都提供了Linux二进制文件。Windows用户可以直接从源代码构建它; 过去已经建立了一些非官方的二进制文件,但似乎并不可靠。

五、Microsoft Azure Cosmos DB键值NoSQL数据库

大多数数据库都有一个总体范例:文档存储,键值存储,队列存储,图形数据库等。Azure Cosmos DB不是。

AzureCosmos DB独有的功能

Cosmos DB使用所谓的原子记录序列存储系统来支持不同的数据模型。原子是原始类型,如字符串,整数和布尔值。记录是原子的集合,如C中的结构。序列是原子或记录的数组。

Cosmos DB使用这些构建块来复制多种数据库类型的行为。它可以重现传统关系数据库中的表的行为。但它也可以重现NoSQL系统中找到的数据类型的功能 – 无模式JSON文档(DocumentDB和MongoDB)和图形(Gremlin,Apache TinkerPop)。

表存储是Cosmos DB提供键值功能的方式。查询表时,使用一组键 – 分区键和行键 – 来检索数据。您可以将分区键视为存储桶或表引用,而行键用于检索具有数据的行。该行可以有多个数据值,但没有任何内容表明您无法创建只存储在任何特定行中的一种数据类型的表。您可以通过.Net代码或REST API调用来检索数据。

AzureCosmos DB如何处理复制和群集

Cosmos DB还提供全球覆盖。存储在Cosmos DB中的数据可以自动复制到Azure云的所有36个区域中。您还可以根据应用程序的需要为读取或查询指定五个一致性级别之一。如果您希望以一致性为代价尽可能降低读取延迟,请选择最终一致性模型。如果您希望获得强一致性,则可以使用它,但代价是将数据限制在单个Azure区域。其他三个选项在这些极点之间取得了不同的平衡。

哪里可以获得Azure Cosmos DB

AzureCosmos DB仅作为MicrosoftAzure云中的服务提供。它不作为内部部署产品提供。

六、Redis键值NoSQL数据库

如果Memcached没有提供足够的功能,请考虑Redis。Redis以Memcached(一个内存中的键值数据存储)背后的相同基本思想开始 – 但更进一步。Redis不仅可以存储和操作比简单的二进制blob更复杂的数据结构,而且还支持磁盘上的持久性。因此,Redis可以作为一个成熟的数据库,而不仅仅是缓存或数据的快速转储基础。

Redis中的数据类型和数据结构

Redis的创建者将其称为“数据结构服务器”。Redis中最基本的数据结构是一个字符串,如果只需要,您可以使用Redis来存储字符串。

但Redis还可以将数据元素存储在较大的集合中 – 列表,集合,散列和更复杂的结构。这与其他NoSQL系统中的文档概念并不完全相同,但它对于在容器中将数据组合在一起的方式提供了一些相同的需求。

应用程序与Redis的交互方式与对Memcached的交互方式大致相同:获取密钥,将其与特定数据块相关联,然后使用密钥获取数据。任何二进制序列都可以用作密钥,最大可达512MB,但越短越好。密钥可以具有生存时间值,也可以根据最近最少使用的规则进行逐出。

密钥本质上是自由形式的,没有与之关联的隐式模式。如果要强制构造键的架构,例如对象:type:thing命名约定,则必须在应用程序中实现它。Redis不会为你做这件事。

要使用数据执行更复杂的操作,可以使用Redis的专用数据类型。这些类似于编程语言中的数据类型,而不是其他数据库中的数据类型,每种类型都适用于不同的用例。

考虑Redis列表,它是使用Java中相同类型的链表结构组织的字符串元素的集合。Redis列表非常适合以固定顺序读取的堆栈或元素列表,因为无论列表大小如何,向列表的头部或尾部添加元素或从列表的尾部添加元素都需要相同的时间。但是,如果您想随机访问项目,最好使用Redis排序集。

Redis中的事务,缓存,脚本和自定义行为

Redis提供了以事务形式自动排队和执行操作的能力。与其他数据库中的事务不同,如果事务中的命令失败,则Redis事务不会自动回滚。

作为其他应用程序之前的缓存层,Redis提供了比Memcached更多的灵活性,从各种缓存逐出策略开始管理数据。除了简单的生存时间策略之外,Redis还允许您执行诸如随机删除密钥或优先删除具有较短生存时间的密钥之类的操作,以便更高效地添加更新的数据。选择的数量一开始可能令人困惑,但建议的默认值适用于绝大多数用例 – 您可以随时以编程方式动态更改策略。

Redis包含Lua语言的解释器,可以在Redis上运行批处理操作。您可以将Lua脚本视为Redis的存储过程版本 – 一种完成任务的方法,这些任务对于单独的Redis来说有点过于复杂,但不需要完整的应用程序。但是请注意,Lua脚本在运行时会构成Redis实例上的阻塞操作。执行Lua脚本时不会发生任何其他事情。

Redis 4于2017年问世,它引入了一个模块系统,为开发人员提供了一种向Redis添加自定义数据结构和功能的方法。

哪里可以获得Redis

您可以直接从官方Redis站点下载Redis源代码。大多数Linux软件包管理器都可以为该版本的Linux安装Redis二进制文件。微软有自己的Redis分支用于创建Windows二进制文件。

原文链接:

https://www.infoworld.com/article/3223728/nosql-standouts-the-best-key-value-databases-compared.html