前言:
在NoSQL数据库中,主要有四大分类,分别是KV键值对数据库、文档型数据库、列存储数据库和图形关系数据库,那么它们各自的特点以及之间的区别是什么呢?这就是今天我们所要学习的内容!
1.KV键值对数据库
1-1 什么是KV数据库?
- KV数据库是一种以键值对(Key-Value)形式来存储数据的数据库
- 类似于Java集合中的Map,每个键(Key)都会对应一个唯一的值(Value)
- Key-Value数据库中最流行的代表之一就是Redis数据库!
在现在的互联网企业中,阿里和百度使用Redis和MemCached,而美团使用的Redis和Tair,新浪使用的也是Redis,Redis的出现频率是相当之高!
1-2 什么是Redis?
-
Redis是一个Key-Value存储系统。它支持存储的Value类型很丰富,包括String (字符串)、List (链表)、Set (集合)、ZSet(sorted set – 有序集合) 和 Hash(哈希类型);这些数据类型都支持push (出栈) / pop (入栈)、add (添加) / remove (移除) 及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的
-
Redis是一个高性能的Key-Value数据库。Redis很大程度补偿了MemCached这类 Key-Value存储的不足 ,在部分场景 可以对关系型数据库起到很好的 补充作用 ,它同时支持Java、C/C++、C#,PHP,JavaScript等多种语言平台,使用起来很方便
-
Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器,这使得Redis可执行单层树复制,存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对 读取操作的可扩展性和数据冗余 很有帮助。
1-3 什么是MemCached?
- memcached是一套分布式的高速缓存系统,由LiveJournal的Brad Fitzpatrick开发,但被许多网站使用。这是一套开放源代码软件,以BSD license授权发布。
- memcached缺乏认证以及安全管制,这代表应该将memcached服务器放置在防火墙后。
- memcached的API使用三十二比特的循环冗余校验(CRC-32) 计算键值 后, 将数据分散在不同的机器上 。 当表格满了以后 ,接下来 新增的数据 会以LRU (页面置换算法中的最近最少使用) 机制替换掉 。由于memcached通常只是当作缓存系统使用,所以使用memcached的应用程序在写回较慢的系统时(像是后端的数据库) 需要额外的代码更新memcached内的数据。
1-4 什么是循环冗余校验?
- 循环冗余校验(全称为Cyclic redundancy check,简称“CRC”)是一种根据 网上数据包或计算机文件等数据 产生 简短固定位数校验码 的一种散列函数,主要用来 检测或校验数据传输或者保存后可能出现的错误。
- 生成的数字在 传输或者存储之前计算 并且 附加到数据后面,然后接收方进行 检验确定数据是否发生变化。
- 一般来说,循环冗余校验的值都是 32位的整数 。由于本函数 易于用二进制的计算机硬件使用 、 容易进行数学分析 并且尤其善于 检测传输通道干扰引起的错误 ,因此获得广泛应用。
1-5 Redis和MemCached的区别和使用场景
主要区别:
- Redis和MemCached都是将数据存放在内存中,都是内存数据库;但MemCached还支持存储图片和视频等;
- Redis不仅仅 支持简单的K-V类型数据 ,同时还 提供List (链表)、Set(集合)、Hash(哈希类型) 等数据结构的存储;
- Redis支持虚拟内存:当物理内存用完时,可以 将一些很久没用到的value值交换到磁盘 中;
- Redis和MemCached都支持过期策略:MemCached 在Set时就可以指定 (例如使用Set key1 0 0 8,即永不过期);Redis 可以通过使用expire设置 (例如使用expire name 10)
- Redis和MemCached都支持分布式,实现一主多从:设定MemCached集群时,可以利用Magent做一主多从;Redis也可以实现一主多从
- Redis支持存储数据安全:如果MemCached 服务器挂掉后,数据就没有了, 而Redis可以 定期保存到磁盘 (即持久化处理);
- Redis支持灾难恢复:如果MemCached服务器挂掉后 ,数据不可恢复,而Redis 数据丢失后,可以通过AOF恢复
- Redis支持数据备份:即 Master-Slave模式的数据备份
- Redis和MemCached应用场景不同:Redis除可以作为NoSQL(非关系型数据库)使用外,还可以 充当消息队列、数据堆栈和数据缓存等 ;而MemCached 适用于缓存SQL语句、数据集、用户临时性数据、延迟查询数据和Session会话等
使用场景:
- 如果有持久方面的需求或者对数据类型和处理有要求,应该选择使用Redis
- 如果只是简单的使用Key-Value存储数据,应该选择使用MemCached
使用案例:
在电商平台中,一般会有商品分类,还有搜索结果列表;针对这种情况,对分类数据可以使用MemCached,因为分类数据一般不会改变,读多写少,直接存储在MemCached中,每次查询都只需要从MemCached中获取就可以了
2.文档型数据库
2-1 什么是文档型数据库?
-
文档型数据库是 NoSQL 中非常重要的一个分支,它主要用来存储索引并管理面向文档的数据或者类似的半结构化数据;
-
顾名思义, 文档型数据库 (面向文档数据库)的关键核心概念即文档(Document),它是数据库中最小的单位。
-
而MongoDB是目前最流行的数据库之一 (目前很多公司开发也在使用,所以MongoDB也成为了企业招聘时的必备技能之一!)
2-2 什么是MongoDB?
-
MongoDB是一个基于分布式文件存储的数据库,由**C++**编写,旨在为Web应用提供可扩展的高性能数据存储的解决方案;
-
MongoDB是一个介于关系型数据库和非关系型数据库之间的产品,是 非关系型数据库中最像关系型数据库的 ,并且其 功能十分丰富!
-
MongoDB主要用来处理大量文档,其 数据结构十分松散,使用的是BSON格式 (类似于JSON,由于其使用二进制形式,又被成为二进制JSON)
3.列存储数据库
谈到列式存储数据库,你可能不太清楚,但你会联想到传统的行式存储数据库,因为列式存储数据库是相对行式存储数据库而言的,就像关系型数据库和非关系型数据库一样,后者的出现都是为了弥补前者在某些场景下的不足而诞生的
3-1 什么是行式存储数据库?
传统的关系型数据库,如 Oracle、DB2、MySQL、SQL Server 等均采用行式存储法 (Row-based),在基于行式存储的数据库中, 数据是按照行数据为基础逻辑存储单元进行存储的, 一行中的数据在存储介质中以连续存储形式存在。
而随着大数据时代的到来,传统的行式存储数据库已经无法满足在某些方面的需求了,所以就出现了列式存储和列式存储数据库
3-2 什么是列式存储?
列式存储 (Column-based) 是相对于行式存储来说的,新兴的 Hbase、HP Vertica、EMC Greenplum 等分布式数据库均采用列式存储。在基于列式存储的数据库中, 数据是按照列数据为基础逻辑存储单元进行存储的,一列中的数据在存储介质中以连续存储形式存在。
3-3 行式存储和列式存储适用场景和区别
行式存储数据库适用场景:
- 适合 随机的增删改查操作
- 需要在行中选取所有属性的查询操作
- 需要 频繁插入或更新的操作,其操作与索引和行的大小更为相关
列式存储数据库适用场景:
- 查询过程中,可针对各列的运算并发执行(SMP),在内存中聚合完整记录集, 可 降低查询响应时间
- 可在数据列中高效查询数据, 无需维护索引 (任何列都能作为索引),查询过程中能够尽量减少无关的IO操作,避免全表扫描
- 因为 各列独立存储, 且数据类型已知,可以针对该列的数据类型、数据量大小等因素 动态选择压缩算法,以 提高物理存储利用率 ( 如果某一行的某一列没有数据,那在列存储时,就可以不存储该列的值,这将比列式存储更节省空间)
当然,列式存储数据库也有不太适用的场景,主要包括:
1.数据需要频繁更新的交易场景;
2.表中列属性较少的小量数据库场景;
3.不适合做含有删除和更新的实时操作
行式存储和列式存储数据库适用场景区别:
行式存储数据库主要使用于在线交易性的OLTP(联机事务处理)应用,而列式存储数据库主要适用于海量静态数据的分析,一般应用于OLAP(联机分析处理)。
但只依靠OLTP还是OLAP来区分是采用行式存储数据库还是列式存储数据库,在很多时候还不是很明确,特别很多时候,有些应用很难说是OLTP还是OLAP,例如对海量数据的查询
3-4 OLTP和OLAP的特点和区别
- 什么是OLTP?
OLTP (全称为On-Line Transaction Processing),即联机事务处理过程,也称为面向交易的处理过程
-
OLTP的特征是是什么?
OLTP的基本特征是:前台接收的用户数据可以立即传送到计算中心进行处理,并在很短的时间内给出处理结果,是对用户操作快速响应的方式之一。
-
什么是OLAP?
OLAP (全称为On-Line Analysis Processing),即联机分析处理,是一种软件技术,它使分析人员能够迅速、一致、交互地从各个方面观察信息,以达到深入理解数据的目的。
- OLAP的特征是什么?
它具有FASMI (Fast Analysis of Shared Multidimensional Information),即共享多维信息的快速分析的特征。
F是快速性 (Fast),指系统能在数秒内对用户的多数分析要求做出反应;
A是可分析性 (Analysis),指用户无需编程就可以定义新的专门计算,将其作为分析的一部分,并以用户所希望的方式给出报告;
M是多维性(Multi—dimensional),指提供对数据分析的多维视图和分析;
I是信息性(Information),指能及时获得信息,并且管理大容量信息。
-
OLTP和OLAP的使用场景:
OLTP(联机事务处理)是传统的关系型数据库的主要应用,主要是基本的、日常的事务处理,例如银行交易
OLAP(联机分析处理)是数据仓库系统的主要应用,支持复杂的分析操作,侧重决策支持,并且提供直观易懂的查询结果
-
OLTP和OLAP区别:
OLTP OLAP 用户 操作人员,底层管理人员 决策人员,高级管理人员 功能 日常操作处理 分析决策 DB设计 面向应用 面向主题 数据 当前的,最新的,细节的,二维的,分立的 历史的,聚集的,多维的,集成的,统一的 存取 读/写数十条记录 读上百条记录 工作单位 简单的事务 复杂的查询 DB大小 100MB-GB 100GB-TB
4.图形关系数据库
4-1 什么是图形关系数据库
-
图形数据库是一种NoSQL(非关系型) 数据库,它应用图形理论存储实体之间的关系信息,例如社会网络中人与人之间的关系。
下面是一张网络人际关系图,如果不使用图形进行表达,其中错综复杂的关系,很难想象如何使用传统的SQL语句进行查询
-
关系型数据库用于存储“关系型”数据的效果并不好,其 查询的复杂和缓慢远远超出预期,而图形数据库的独特设计 恰恰弥补了这个缺陷。
-
在一个图形数据库中,最主要的组成有两种,结点集和连接结点的关系(有的也称泡泡和箭头);结点集就是 图中一系列结点的集合,比较接近于关系数据库中 所最常使用的表,而关系则是图形数据库所特有的组成。
-
常用的图形数据库有Neo4j、GraphDB、InfiniteGraph和HugeGraph等
4-2 什么是Neo4j?
- Neo4j是一个流行的图形数据库,它是开源的
- 最近,Neo4j的社区版已经由遵循AGPL许可协议转向了遵循GPL许可协议,尽管如此,Neo4j的企业版依然使用AGPL许可。
- Neo4j基于Java实现,兼容ACID特性,也支持其他编程语言,如Ruby和Python。
4-3 GPL许可协议和AGPL协议的区别
- 什么是GPL许可协议?
GPL (全称为GNU General Public License,又称GNU GPL),即GNU通用公共许可协议,是一个广泛被使用的自由软件许可协议,最初由理查德·斯托曼为GNU计划而撰写。
2007年6月29日发布了最新版本——“第3版”(v3)。
GPL给予了电脑程序自由软件的定义,并且使用“Copyleft”来确保程序的自由被完善的保留。
- 什么是AGPL许可协议?
AGPL是GPL的一个补充, 在GPL的基础上加了一些限制。
原有的GPL协议,由于网络服务公司兴起(例如Google)产生了一定的漏洞,比如使用GPL的自由软件,但是并不发布于网络之中,则可以自由的使用GPL协议却不开源自己私有的解决方案,AGPL则增加了对此做法的约束
AGPL协议的制定是为了避免一个GPL/LGPL协议中的漏洞,称之为 Web Service Loophole。
4-4 什么是GraphDB?
- GraphDB是德国sones公司在.NET基础上构建的。
- GraphDB社区版遵循AGPL v3许可协议,企业版是商业化的。
- GraphDB托管在Windows Azure平台上。
4-5 什么是InfiniteGraph?
- InfiniteGraph基于Java实现,它的目标是构建“分布式的图形数据库”,已被美国国防部和美国中央情报局所采用。
- 除此之外,还有其他一些图形数据库,如OrientDB、InfoGrid和HypergraphDB。
- Ravel构建在开源的Pregel实现之上,微软研究院的Trinity项目也是一个图形数据库项目。
4-6 什么是HugeGraph?
- HugeGraph是百度开源的分布式图数据库。
- 支持标准的Apache Tinkerpop Gremlin图查询语言,支持属性图,可支持千亿级规模关系数据;
- 支持多种后端存储(Cassandra,HBase,RocksDB,MySQL,PostgreSQL,ScyllaDB);
- 支持各类索引(二级索引、范围索引、全文索引、联合索引,均无需依赖第三方索引库);
- 提供可视化的Web界面,可用于图建模、数据导入、图分析;
- 提供导入工具,支持从多种数据源中导入数据到图中,支持的数据源包括:CSV、HDFS、关系型数据库(MySQL、Oracle、SQL Server、PostgreSQL);
- 支持REST接口,并提供10+种通用的图算法;
- 支持与Hadoop、Spark GraphX等大数据系统集成。
5.四种NoSQL数据库的对比
分类 | 数据模型 | 典型代表 | 优点 | 缺点 | 应用场景 |
---|---|---|---|---|---|
KV键值对数据库 | Key指向Vlaue的键值对,通常用哈希表来实现 | Redis、Voldemort、Orcale BDB等 | 查找速度快 | 数据无结构化(通常纸被当做字符串或者二进制数据) | 适用于内容缓存,用于处理大量数据的高访问负载,也用于一些日志系统等等 |
文档型数据库 | Key-Value对应的键值对,Value为结构化数据 | MongoDB、CouchDB等 | 数据结构要求不严格,表结构可变(不需要像关系型数据库一样,需预先定义表结构) | 查询性能不高,而且缺乏统一的查询语法 | Web应用(与Key-Value类似,Value是结构化的,不同的是数据库能够了解Value的内容) |
列存储数据库 | 分布式的文件存储系统 | HBase、Cassandra、Riak等 | 查找速度快,可扩展性强,更容易进行分布式扩展 | 功能相对局限 | 分布式的文件系统 |
图形数据库 | 图结构 | Neo4j、GraphDB、InfiniteGraph、HugeGraph等 | 可以利用图结构相关算法 (如最短路径寻址,N度关系查找等) | 很多时候需要对整个图做计算才能得出需要的信息,而且这种结构不太好做分布式集群 | 社交网络关系,个性推荐系统等,专注于构建关系图谱 |
好了,今天关于NoSQL数据库的四大分类学习就到此结束了,欢迎大家学习和讨论!
参考视频链接:
https://www.bilibili.com/video/BV1S54y1R7SB (B站UP主遇见狂神说的Redis基础学习)
参考资料链接:
https://baike.baidu.com/item/Redis/6549233 (Redis 百度百科)
https://baike.baidu.com/item/Memcached/1625373 (memcached 百度百科)
https://baike.baidu.com/item/%E5%BE%AA%E7%8E%AF%E5%86%97%E4%BD%99%E6%A3%80%E6%9F%A5/10168241 (循环冗余校验 百度百科)
https://baike.baidu.com/item/mongodb/60411 (mongodb 百度百科)
https://baike.baidu.com/item/OLTP/5019563 (OLTP 百度百科)
https://baike.baidu.com/item/%E8%81%94%E6%9C%BA%E5%88%86%E6%9E%90%E5%A4%84%E7%90%86/423874 (联机分析处理 百度百科)
https://baike.baidu.com/item/GNU%E9%80%9A%E7%94%A8%E5%85%AC%E5%85%B1%E8%AE%B8%E5%8F%AF%E8%AF%81/393832 (GNU通用公共许可证 百度百科)
https://baike.baidu.com/item/AGPL/4949728 (AGPL 百度百科)
参考博客链接:
https://searchdatabase.techtarget.com.cn/7-20834 (悉数11种主流NoSQL文档型数据库)
https://blog.csdn.net/u010398838/article/details/79995636 (redis和memcached的区别和使用场景)
https://cloud.tencent.com/developer/article/1528525 (数据库中的 “行式存储”和“列式存储”)
http://www.cnblogs.com/taven/archive/2012/03/05/2380557.html (OLTP 和 OLAP 的区别)
https://www.jianshu.com/p/9f204c50d309 (NoSQL数据库的四大类型)