持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第7天,点击查看活动详情
首先我们了解一下键值存储实现原理:
学过Java基础后我们知道键值对即key-value模式,在键值对数据库里面放宽了对值内容的限制,只保证key的唯一性,value不限制,可以是字符串,数字,图片,视频等。
- ⚠️ 注意:这个 key 和 value 一定是成对出现的,缺少一个都不行。
- ⚠️ 注意:键不是越长越好(一般不要超过 1024 个字节),键的内容越多,内存开销就越大,从而会降低查询效率;键的内容太短也不好,可读性不高;在同一类数据集合中,键的命名规范最好统一。
- ⚠️ 注意:键值模式的 NoSQL 数据库通常不支持对值建立索引。不同的键值数据库对值会有不同的约束,特别是在值存储的大小上(甚至是不同数据对象的约束都不一样)。
对数据操作的几个常用命令:
- put(set) 命令:用于写或者更新键值存储里指定地址的值(当指定了地址值,此时若更新值时,没有值就会新增一个值)。
- get 命令:用于读取键值存储里指定地址的值。
- delete 命令:用于删除键值存储指定地址的键和值。
键值模式的优缺点
优点:
- 简单:数据存储结构只有键和值,不用预先定义数据类型,值理论上可以存储任意数据。
- 快速:以内存为主的设计思路使他拥有了快速处理数据的能力。
- 高效:数据结构简单化,数据之间没有关联关系,在大量用户访问下,可以快速响应用户的请求。
- 分布式处理:具备了处理大数据的能力
缺点:
- 一般不提供对值的直接查找:键值数据库设计之初就以键为主要对象进行各种数据操作,对值直接进行操作的功能很弱。
- 缺少约束,容易出错:原则上值里什么数据都可以存放,甚至放错了都不会报错。
- 不容易建立复杂关系:键值数据库局限于两个数据集之间的有限计算,比如 Redis 数据库里的交、并、补集运算。
文档存储的实现
文档数据库旨在将半结构化数据存储为文档的一种数据库。文档数据库可以存放或获取文档,可以支持多种文档格式,文档数据库中存放的文档,就相当于键值数据库所存放的“值”。
- ⚠️ 注意:文档存储模式和键值存储模式有相似性,文档存储其值是半结构化内容,可以通过关键词查找文档内部的结构和内容,而非只通过键来进行检索
文档存储特点
功能特点:
- 面向集合存储,易存储对象类型的数据
- 支持动态查询
- 支持完全索引,包含内部对象
- 支持复制和故障恢复等等
那这个文档存储与我们前面的键值存储有啥区别呢?
实际上文档存储和键值存储很相似,它们之间不同的是:键值存储很少直接对 value 进行操作,一般都是直接操作 key;而文档存储关心的是文档的内部结构,这使存储引擎可以直接支持二级索引,从而允许对任意字段进行高效查询。
文档存储优缺点
优点:
- 内容集中,简化关系:所有的内容都在一个数据库中,信息不分散在多个链接数据库中。相比较 SQL 数据库,简化了数据之间复杂的关系。
- 灵活,支持全文检索:文档存储数据库可以没有任何内容,不需要文档有一致性,可以存储大量的数据。可以允许对任意字段进行高效查询。
缺点:
- 数据丢失:可能会由于缺乏熟悉性而导致配置错误,又或者由于使用单个节点,这些都有可能导致数据丢失。
- 限制复杂查询:文档存储数据库其实不太适合运行多个复杂的操作或复杂的查询。
列族存储
列是列族数据库的基本存储单元,若干个列可以构成一个行,各行之间可以具备相同的列,也可以具备不同的列。如果列的数量比较多,最好把相关的列分成组,这些由列构成的组就叫做列族(column family) 。
列族数据库将数据存储在列族中,而列族中的行把许多列数据与本行的“行键”(row key)管理起来(这里的列族可以看作关系型数据库中的表(table) )。
- ⚠️ 注意:关系型数据库中列(column) ,每行所对应的各列均相同;列族数据库中的列(column) ,不同的行所对应的列可以有差别。
功能特征:
- 按列存储数据
- 方便存储结构化和半结构化数据
- 方便进行数据压缩
- 对某一列或某几列的查询有着极大的 IO 优势
列族数据库一般适用于那种需要部署在大规模数据库的场合,在那种场合中所使用的数据库需要具备较高的写入性能,并且要能再大量的服务器及多个数据中心上面运作。
列族存储与我们前面学习的键值存储有啥异同
相同点:它们都是键值存储的;
区别:列族数据库中的值是根据标识符,列名以及时间戳来进行索引的;而键值数据库则是根据健来进行索引。
列族查询优缺点
优点:
- 可扩展性:它能够根据数据库的规模分布在百台不同的机器上,支持大规模并行处理。
- 方便压缩:擅长压缩数据,从而节省存储空间。
- 反应灵敏:加载时间短,查询执行速度快。
缺点:
- 不擅长更新事务处理:对于在线事务处理,这些数据库不是很高效。
- 特定行的查询会影响性能:对于特定行的查询,需要引入额外的步骤,即扫描列以识别行,然后定位要检索的数据。访问分散在多列中的单个记录需要很多时间,而访问单个列中的分组记录会更快。频繁的行特定查询可能会降低列式数据库的速度,从而导致性能问题。
图存储
图形数据库是以图论为基础的,用图来表示一个对象集合,包括顶点和连接顶点的边(比如有向图、无向图、加权图、二分图等等)。一幅简单的图形是由一系列结点与边线所构成。实际开发中,图型数据库会赋予结点与连线更多类别与属性,以使其更具有可描述性及实际应用功能。
- ⚠️ 注意:图数据库就是由顶点和边组成的。图数据库并非指存储图片的数据库,而是以图这种数据结构存储和查询数据。
主要有以下功能特征:
- 支持高性能
- 支持分布式部署
- 支持快速遍历
随着社交、电商、金融、零售、物联网等行业的快速发展,大数据行业需要处理的数据之间的关系随数据量呈几何级数增长,急需一种支持海量复杂数据关系运算的数据库,而图数据库就能够解决这样的问题。现在各行各业基本都有使用图数据库,比如:社交领域、零售领域、金融领域、电信领域、旅游领域等等。
特点
特点么?
👨🏫:当然可以。图数据库有以下特点:
- 图数据库由顶点和边组成
- 图数据库中顶点都是实体,边则表示关联
- 顶点和边都可以带多个属性,其中边的一种重要属性是权值
- 边分为有向边和无向边
- 路径表示两个顶点之间的一条通路
- 图数据库一般运行在一台服务器上,需要垂直扩展