键值数据库,也称为键值存储,是一种 NoSQL 数据库类型,其中数据以键值对的形式存储,并针对读取和写入该数据进行了优化。数据可以通过一个唯一的键或多个唯一的键来检索与每个键关联的值。值可以是简单的数据类型,如字符串和数字,也可以是复杂对象。
唯一的键可以是任何东西。大多数情况下,它是一个 id 字段,因为这是所有文档中唯一的字段。为了分组相关项,您也可以在键中添加一个公共前缀。键值对的通用结构是 key: value。例如,“name”: “John Drake。”
目录
多年来,数据库系统已从存储在行和列中的传统关系数据库发展到允许针对每个用例提供解决方案的分布式数据库。键值对存储不是一个新概念,并且在过去的几十年中一直存在。已知的一个存储是旧的 Microsoft Windows 注册表,它允许系统/应用程序在“键值”结构中存储数据,其中键可以表示为唯一标识符或值唯一的路径。
数据根据键写入(插入、更新和删除)并查询以存储/检索其值。
键值数据库针对性能进行了优化,并且根据用例,存在不同类型的键值数据库。例如,如果您使用键值数据库的目的是缓存,则可以使用内存中的键值存储。如果您正在寻找持久存储(磁盘),则可以使用持久键值数据库。还有多模型键值数据库,支持多种数据模型,如文档、图和键值,从而提供灵活性。流行的键值数据库示例包括
键值数据库,又称键值存储,将一个值(可以是数字、简单字符串到复杂对象等任何东西)与一个唯一的标识符(键)关联起来,用于跟踪该对象。在其最简单的形式中,键值存储类似于大多数编程范式中的字典/数组/映射对象,但由数据库管理系统(DBMS)管理。
键值数据库执行了三种主要操作
与关系数据库不同,键值数据存储不遵循特定的模式,这使得它们很灵活。这使得它们非常适合非结构化和半结构化数据。与关系数据库表结构相比,在键值存储中存储和检索数据变得更加简单。在下面的图像中,由于JSON结构,所有数据都被组合在一起。你可以存储从简单类型到复杂类型的任何东西作为值。在检索数据时,你可以通过迭代JSON数据来检索单个记录。
通常,你可以将一个项作为单独的键值对存储。然而,对于存储复杂对象(如客户)的情况,你可能希望存储所有相关的详细信息,如客户名称和电子邮件地址等。你可以通过为键使用一致的命名约定(如前缀)来分组相关项。例如,我们可以有键为“customer:1”、“customer:2”等。要读取此类相关数据,你可以遍历具有共同前缀的键。
键值数据库使用紧凑、高效的索引结构,能够快速可靠地通过键定位值,这使得它们非常适合需要能够以恒定时间查找和检索数据的系统。
如MongoDB之类的文档数据库不仅支持快速检索复杂数据类型,而且还提供了更多高级查询功能。MongoDB在数据类型简单时可以像键值存储数据库一样工作,而在涉及更复杂的数据类型或嵌套结构时可以作为一个完整的文档数据库。
Redis是一种针对在持久数据库中跟踪相对简单数据结构(原始类型、列表、堆和映射)进行优化的键值数据库。通过仅支持有限数量的值类型,Redis能够提供一个极其简单的查询和操作它们的界面,并且配置得当的情况下具有高吞吐量。
键值数据库的定义是它允许程序或程序用户通过键检索数据,键实际上是名称或指向某些存储值的标识符。因为键值数据库定义得如此简单,所以可以更快地获取准确的信息。以下是键值数据库的一些重要功能:
键值数据库没有固定的模式或表结构。因此,当数据演变时,很容易将键值存储从一个系统迁移到另一个系统而无需更改架构或设计。灵活的数据结构也保证了速度和可扩展性。
因为没有固定的结构,键值数据库不需要查询语言进行CRUD操作。你可以简单地给出键作为输入,并获取值作为输出。一些键值数据库支持查询的高级功能,例如检索相关项集、聚合、文本搜索和部分字段检索。
除了简单的字符串或数字类型外,键值数据库还可以支持数组、JSON、日期、媒体文件(二进制数据)和嵌套结构等数据类型。
高级键值数据库除了主索引外,还支持多种类型的索引,如二级索引、哈希索引、基于树的索引和通配符索引,以提高数据检索的性能和效率。
在以下几种场景下,选择键值存储方法是一种最优的解决方案
实时随机数据访问,例如在线游戏或金融应用中的用户会话属性
基于键的频繁访问数据或配置的缓存机制
应用程序是基于简单的基于键的查询设计的
虽然MongoDB主要是一个文档数据库,但它涵盖了广泛的数据库示例和用例,支持键值对数据概念。凭借其灵活的模式和丰富的查询语言以及二级索引,MongoDB是“键值”数据的诱人存储库。
在本文中了解更多信息,并使用MongoDB Atlas(MongoDB的数据库即服务平台)尝试。
MongoDB将数据存储在集合中,集合是一组BSON(二进制JSON)文档,每个文档本质上是由字段-值结构构建的。MongoDB能够高效地存储灵活的模式文档并对任何附加字段进行索引,以便进行随机搜索,这使得它成为一个引人注目的键值存储库。
{
session_id : "ueyrt-jshdt-6783-utyrts",
create_time : 1122384666000
}
此外,MongoDB的文档值允许嵌套键值结构,不仅允许以全局方式通过键访问数据,还允许访问和操作与键关联的数据,甚至创建允许通过这些二级键快速检索的索引。
{
name: "John",
age : 35,
dob : ISODate("01-05-1990"),
profile_pic : "https://example.com/john.jpg",
social : {
twitter : "@mongojohn",
linkedin : "https://linkedin.com/abcd_mongojohn"
}
}
MongoDB的本地驱动程序支持Python、C#、C++和Node.js等多种常用语言,允许您使用您选择的任何语言存储键值数据。
每个字段都可以根据您的查询模式进行索引。例如,如果我们以特定的sessionid作为键和创建时间作为值进行搜索,我们可以对db.sessions.createIndex({session_id : 1})
进行索引并基于该键进行查询
db.sessions.find({session_id : "ueyrt-jshdt-6783-utyrts" },{create_time : 1}).create_time;
通配符索引允许用户对MongoDB集合中的每个字段或字段子集进行索引。因此,如果我们有一组存储在单个文档中的字段-值类型,并且查询可以动态地针对每个标识符进行,我们可以为这些字段值集创建单个索引。
db.profiles.createIndex({"$**" : 1 });
因此,我们的查询将支持由此索引提供的每个字段-值查询。话虽如此,通配符索引仅应在无法预先预测字段名称且查询谓词的多样性需要这样做的情况下使用。有关更多信息,请参阅通配符限制。
由于MongoDB文档可以是复杂对象,因此应用程序可以使用模式设计来最小化索引足迹并优化“键值”方法的访问。这种设计模式被称为属性模式,它使用文档数组来存储“键值”结构。
attributes: [
{
key: "USA",
value: ISODate("1977-05-20T01:00:00+01:00")
},
{
key: "France",
value: ISODate("1977-10-19T01:00:00+01:00")
},
{
key: "Italy",
value: ISODate("1977-10-20T01:00:00+01:00")
},
{
key: "UK",
value: ISODate("1977-12-27T01:00:00+01:00")
},
...
]
索引{attributes.key : 1 , attributes.value : 1}
将允许我们通过一个索引搜索任何键。
支持键值存储的数据库将数据持久化到存储数据库文件的磁盘上,而键值缓存实现将主要在内存中保持数据加载状态。[链接](https://mongodb.ac.cn/databases/in-memory-database)。在服务器故障或重启的情况下,由于数据不持久,需要预先将数据加载到缓存中。
MongoDB使用其WiredTiger引擎的缓存来优化数据访问和读取性能,同时保证副本集之间的强一致性和高可用性。这允许在保持最佳缓存数据性能的同时,提供更健壮和可用的字段值存储。
键值方法允许定义高效且紧凑的数据结构,以简单的键值检索/更新/删除形式访问数据。
MongoDB文档可以形成紧凑灵活的结构,以支持对键值存储的快速索引。另一方面,MongoDB文档可能包含复杂对象,可以包含整个层次结构和子值,而复杂的索引允许通过任意数量的不同键检索文档。
键值存储用于需要通过键快速检索值的应用场景,如编程语言中的映射或字典。这种紧凑的结构和直接的索引和查找方式使这种数据库概念在特定应用程序工作负载中具有优势。
然而,现代应用程序可能需要不仅仅是键值检索,这正是MongoDB和MongoDB Atlas提供最佳解决方案的地方。MongoDB可以在支持字段值存储的同时,允许形成复杂对象和多种查询数据的方式:[全文搜索](https://mongodb.ac.cn/atlas/search)、[聚合框架](https://docs.mongodb.com/manual/aggregation)、[Atlas数据分层](https://mongodb.ac.cn/atlas/online-archive)或[跨多个分片扩展](https://mongodb.ac.cn/basics/scaling)。
键值数据库是一种NoSQL数据库,以键值对的形式存储数据——例如,“name”: “John Drake”。在这里,名称是唯一键,用于标识对象,John Drake是与它关联的值。