Table of Contents
关系型数据库(Relational Database)
什么是关系数据库
什么是SQL?
关系数据库的结构
关系模型
关系数据库的好处
数据一致性
隔离性和原子性
ACID和关系数据库
存储过程和关系数据库
数据库锁定和并发
选择关系数据库时要寻找什么
未来的关系数据库
非关系型数据库 - Nosql介绍
NoSQL数据库的类型是什么?
NoSQL数据库如何工作
Nosql和关系型数据库的区别
1.存储方式
2.存储结构
3.存储规范
4.存储扩展
5.查询方式
6.事务
7.性能
8.授权方式
ACID理论
1. 原子性
2. 一致性
3. 隔离性
4. 持久性
Redis,Memcache,MongoDb的特点与区别
Redis
优点
缺点
Memcache
优点
缺点
MongoDB
优点
缺点
Redis、Memcache和MongoDB的区别
1.性能
2.便利性
3.存储空间
4.可用性
5.可靠性
6.一致性
7.数据分析
8.应用场景
Redis 简介
Redis 优势
关系型数据库(Relational Database)
什么是关系数据库
关系数据库是一种类型的数据库,其存储并提供访问被彼此相关的数据点。关系数据库基于关系模型,这是一种在表中表示数据的直观,直接的方法。在关系数据库中,表中的每一行都是一条记录,该记录具有唯一的ID(称为key)。该表的列保存数据的属性,每个记录通常为每个属性都有一个值,这使得在数据点之间建立关系变得容易。
什么是SQL?
现在我们已经了解了NoSQL数据库,让我们将它们与传统上最流行的数据库进行对比:SQL(结构化查询语言)访问的关系数据库。与关系数据库交互时可以使用SQL,在关系数据库中数据存储在具有固定列和行的表中。
SQL数据库在1970年代初开始流行。当时,存储非常昂贵,因此软件工程师对他们的数据库进行规范化以减少数据重复。
1970年代的软件工程师通常也遵循瀑布式软件开发模型。在开始开发之前,详细计划了项目。软件工程师精心创建复杂的实体关系(ER)图,以确保他们仔细考虑了需要存储的所有数据。由于采用了这种预先计划模型,如果在开发周期中需求发生变化,软件工程师就难以适应。结果,项目经常超出预算,超过了截止日期,无法满足用户需求。 -- https://www.mongodb.com/nosql-explained
关系数据库的结构
关系模型意味着逻辑数据结构(数据表,视图和索引)与物理存储结构是分开的。这种分离意味着数据库管理员可以管理物理数据存储,而不会影响对作为逻辑结构的数据的访问。例如,重命名数据库文件不会重命名存储在其中的表。
逻辑操作和物理操作之间的区别也适用于数据库操作,这是明确定义的操作,使应用程序能够操纵数据库的数据和结构。逻辑操作允许应用程序指定其所需的内容,而物理操作则确定应如何访问该数据然后执行任务。
为了确保数据始终准确且可访问,关系数据库遵循某些完整性规则。例如,完整性规则可以指定不允许在表中重复行,以消除潜在的错误信息进入数据库的可能性。
关系模型
在数据库的早期,每个应用程序都以自己独特的结构存储数据。当开发人员想要构建使用该数据的应用程序时,他们必须对特定的数据结构了解很多,才能找到所需的数据。这些数据结构效率低下,难以维护且难以优化以提供良好的应用程序性能。设计关系数据库模型是为了解决多个任意数据结构的问题。
关系模型提供了表示和查询可被任何应用程序使用的数据的标准方式。从一开始,开发人员就认识到关系数据库模型的主要优势在于表的使用,这是一种存储,访问结构化信息的直观,有效且灵活的方式。
随着时间的流逝,随着开发人员开始使用结构化查询语言(SQL)在数据库中写入和查询数据,关系模型的另一优势出现了。多年来,SQL已被广泛用作数据库查询的语言。SQL基于关系代数,提供了一种内部一致的数学语言,可以更轻松地提高所有数据库查询的性能。相比之下,其他方法必须定义单个查询。
关系数据库的好处
所有类型和规模的组织都使用简单而强大的关系模型来满足各种信息需求。关系数据库用于跟踪库存,处理电子商务交易,管理大量关键任务客户信息等等。可以考虑将关系数据库用于数据点彼此相关的任何信息需求,并且必须以安全,基于规则的一致方式进行管理。
关系数据库自1970年代就已经存在。如今,关系模型的优势继续使其成为数据库中最广泛接受的模型。
数据一致性
关系模型最适合维护应用程序和数据库副本(称为实例)之间的数据一致性。例如,当客户在ATM机上存钱,然后查看手机上的帐户余额时,客户希望看到该笔存款会立即反映在更新的帐户余额中。关系数据库在这种数据一致性方面表现出色,可确保数据库的多个实例始终具有相同的数据。
对于其他类型的数据库,很难与大量数据保持这种及时的一致性。最近的某些数据库(例如NoSQL)只能提供“最终一致性”。根据此原理,在扩展数据库或多个用户同时访问同一数据时,数据需要一些时间来“追赶”。最终的一致性对于某些用途是可以接受的,例如在产品目录中维护列表,但是对于关键业务操作(例如购物车交易),关系数据库仍然是黄金标准。
隔离性和原子性
关系数据库在非常细粒度的级别上处理业务规则和策略,并具有关于隔离的严格策略(即,永久更改数据库)。例如,考虑一个库存数据库,该数据库跟踪始终一起使用的三个部分。从库存中拉出一个零件时,还必须拉出另外两个。如果这三个部分之一不可用,则不应该拉扯任何一个部分-数据库作出任何隔离之前,所有三个部分都必须可用。关系数据库在知道可以对所有三个数据库都提交之前,不会提交一部分。这种多方面的隔离能力称为原子性。原子性是确保数据库中数据准确并确保其符合业务规则,法规和政策的关键。
ACID和关系数据库
定义关系数据库事务的四个关键属性是:原子性,一致性,隔离性和持久性(通常称为ACID)。
- 原子性定义了构成完整数据库事务的所有元素。
- 一致性定义了在事务之后将数据点保持在正确状态的规则。
- 隔离使事务的效果对其他人不可见,直到提交为止,以避免混淆。
- 持久性可确保一旦提交事务,数据更改将成为永久性的。
- Atomic:All operations in a transaction succeed or every operation is rolled back.
- Consistent:On the completion of a transaction, the database is structurally sound.
- Isolated:Transactions do not contend with one another. Contentious access to data is moderated by the database so that transactions appear to run sequentially.
- Durable:The results of applying a transaction are permanent, even in the presence of failures.
- Atomic:事务中的所有操作都会成功,或者每个操作都会回滚。
- 一致的:事务完成后,数据库在结构上是健全的。
- 孤立:交易不相互竞争。数据库对有争议的数据访问进行仲裁,以便事务似乎按顺序运行。
- 持久性:即使存在故障,应用事务的结果也是永久的。
存储过程和关系数据库
数据访问涉及许多重复操作。例如,从数据表中获取信息的简单查询可能需要重复数百或数千次才能产生所需的结果。这些数据访问功能需要某种类型的代码才能访问数据库。应用程序开发人员不想在每个新应用程序中为这些功能编写新代码。幸运的是,关系数据库允许存储过程,这是可以通过简单的应用程序调用访问的代码块。例如,单个存储过程可以为多个应用程序的用户提供一致的记录标记。存储过程还可以帮助开发人员确保以特定方式实现应用程序中的某些数据功能。
数据库锁定和并发
当多个用户或应用程序试图同时更改同一数据时,数据库中可能会发生冲突。锁定和并发技术可在保持数据完整性的同时减少发生冲突的可能性。
锁定可防止其他用户和应用程序在更新数据时访问数据。在某些数据库中,锁定适用于整个表,这会对应用程序性能产生负面影响。其他数据库(例如Oracle关系数据库)在记录级别应用锁,使表中的其他记录可用,从而有助于确保更好的应用程序性能。
当多个用户或应用程序同时在同一数据库上调用查询时,并发管理活动。根据为数据控制定义的策略,此功能提供了对用户和应用程序的正确访问。
选择关系数据库时要寻找什么
用于存储,管理,查询和检索关系数据库中存储的数据的软件称为关系数据库管理系统(RDBMSf)(《RDBMS即关系数据库管理系统(Relational Database Management System)》)。RDBMS提供用户与应用程序和数据库之间的接口,以及用于管理数据存储,访问和性能的管理功能。
在数据库类型和关系数据库产品之间进行选择时,有几个因素可以指导您做出决定。您选择的RDBMS将取决于您的业务需求。问问自己以下问题:
- 我们的数据准确性要求是什么?数据存储和准确性将取决于业务逻辑吗?我们的数据对准确性是否有严格的要求(例如,财务数据和政府报告)?
- 我们需要可扩展性吗?要管理的数据规模是多少?预期的增长量是多少?数据库模型是否需要支持镜像数据库副本(作为单独的实例)以实现可伸缩性?如果是这样,它可以在这些实例之间保持数据一致性吗?
- 并发有多重要?多个用户和应用程序是否需要同时进行数据访问?数据库软件在保护数据的同时是否支持并发?
- 我们对性能和可靠性有何需求?我们需要高性能,高可靠性的产品吗?查询响应性能有哪些要求?供应商对服务水平协议(SLA)或计划外停机的隔离是什么?
未来的关系数据库
多年来,关系数据库已经变得越来越好,越来越快,越来越强大并且更易于使用。但是它们也变得更加复杂,并且管理数据库长期以来一直是一项全职工作。开发人员必须将大部分时间花在优化数据库性能所需的管理活动上,而不是将他们的专业知识用于开发可为业务带来价值的创新应用程序。
如今,自主技术正在利用关系模型的优势来提供新型的关系数据库。该数据库(又称独立数据库)维护权力和关系模型的优点,但采用人工智能(AI),机器学习和自动化监控和提高查询性能和管理任务。例如,为了提高查询性能,自动驾驶数据库可以对索引进行假设和测试,以加快查询速度,然后将最佳查询推入生产环境(全部依靠自己)。自动驾驶数据库无需人工干预即可连续进行这些改进。
自主技术使开发人员摆脱了管理数据库的繁琐任务。例如,他们不再需要预先确定基础架构要求。相反,使用自动驾驶数据库,他们可以根据需要添加存储和计算资源以支持数据库增长。仅需几个步骤,开发人员就可以轻松创建自治的关系数据库,从而加快了应用程序开发的时间。
非关系型数据库 - Nosql介绍
Nosql的全称是Not Only Sql,这个概念早起就有人提出,在09年的时候比较火。Nosql指的是非关系型数据库,而我们常用的都是关系型数据库。就像我们常用的mysql,sqlserver一样,这些数据库一般用来存储重要信息,应对普通的业务是没有问题的。但是,随着互联网的高速发展,传统的关系型数据库在应付超大规模,超大流量以及高并发的时候力不从心。而就在这个时候,Nosql得到的告诉的发展。
人们使用“ NoSQL数据库”一词时,通常会使用它来指代任何非关系数据库。有人说“ NoSQL”代表“非SQL”,而另一些人则说“不仅SQL”。无论哪种方式,大多数人都认为NoSQL数据库是以关系表以外的格式存储数据的数据库。
一个常见的误解是NoSQL数据库或非关系数据库不能很好地存储关系数据。NoSQL数据库可以存储关系数据-它们与关系数据库的存储方式不同。实际上,与SQL数据库相比,许多人发现NoSQL数据库中的建模关系数据比SQL数据库中的建模关系数据更容易,因为不必在表之间拆分相关数据。
NoSQL数据模型允许将相关数据嵌套在单个数据结构中。
随着存储成本的急剧下降,NoSQL数据库出现在2000年代后期。仅出于减少数据重复的目的而创建复杂,难以管理的数据模型的日子已经一去不复返了。开发人员(而非存储人员)已成为软件开发的主要成本,因此NoSQL数据库针对开发人员的生产力进行了优化。 -- https://www.mongodb.com/nosql-explained
随着存储成本迅速降低,存储和查询所需的数据应用程序数量也增加了。这些数据具有各种形状和大小(结构化,半结构化和多态性),因此预先定义架构几乎变得不可能。NoSQL数据库允许开发人员存储大量非结构化数据,从而为他们提供了很大的灵活性。
此外,敏捷越来越受欢迎,软件工程师也在重新考虑他们开发软件的方式。他们认识到需要快速适应不断变化的需求。他们需要能够快速迭代并在整个软件堆栈中进行更改(一直到数据库模型)的能力。NoSQL数据库为他们提供了这种灵活性。
云计算也越来越流行,开发人员开始使用公共云来托管其应用程序和数据。他们希望能够在多个服务器和区域之间分布数据,以使其应用程序具有弹性,可以横向扩展而不是纵向扩展以及对数据进行智能地理定位。一些NoSQL数据库(如MongoDB)提供了这些功能。
NoSQL数据库的类型是什么?
https://www.mongodb.com/nosql-explained
随着时间的流逝,出现了四种主要的NoSQL数据库类型: 文档数据库,键值数据库,宽列存储和图形数据库。让我们检查每种类型。
- 文档数据库将数据存储在类似于JSON(JavaScript对象符号)对象的文档中。每个文档包含成对的字段和值。这些值通常可以是多种类型,包括字符串,数字,布尔值,数组或对象之类的东西,并且它们的结构通常与开发人员在代码中使用的对象保持一致。由于它们的字段值类型和强大的查询语言多种多样,因此文档数据库非常适合各种各样的用例,并且可以用作通用数据库。他们可以水平扩展以适应大数据量。根据DB引擎,MongoDB一直被评为全球最受欢迎的NoSQL数据库,并且是文档数据库的一个示例。有关文档数据库的更多信息,请访问什么是文档数据库?。
- 键值数据库是一种较简单的数据库,其中每个项目都包含键和值。通常只能通过引用值来检索值,因此学习如何查询特定键值对通常很简单。键值数据库非常适合需要存储大量数据但无需执行复杂查询来检索数据的用例。常见的用例包括存储用户首选项或缓存。Redis和DynanoDB是流行的键值数据库。
- 宽列存储将数据存储在表,行和动态列中。宽列存储提供了比关系数据库更大的灵活性,因为不需要每一行都具有相同的列。许多人认为宽列存储是二维键值数据库。宽列存储非常适合需要存储大量数据并且可以预测查询模式的情况。宽列存储通常用于存储物联网数据和用户配置文件数据。Cassandra和HBase是最受欢迎的两家宽列商店。
- 图形数据库将数据存储在节点和边中。节点通常存储有关人物,地点和事物的信息,而边缘则存储有关节点之间的关系的信息。在需要遍历关系以查找模式(例如社交网络,欺诈检测和推荐引擎)的用例中,图形数据库非常出色。Neo4j和JanusGraph是图形数据库的示例。
NoSQL数据库如何工作
https://www.mongodb.com/nosql-explained
从设计角度理解NoSQL数据库的吸引力的一种方法是,在使用地址数据的过于简化的示例中,查看SQL和NoSQL数据库的数据模型的外观。
SQL案例。 对于SQL数据库,从地址的逻辑结构开始建立用于地址的数据库,并且期望要存储的记录将保持相对不变。在分析了预期的查询模式之后,SQL数据库可能会优化两个表中的存储,一个用于基本信息,另一个用于成为客户,姓氏是两个表的键。每个表中的每一行都是一个客户,每列具有以下固定属性:
- 姓氏::名字::中间名首字母::地址字段::电子邮件地址::电话号码
- 姓氏::生日::帐号::客户年份::沟通偏好
NoSQL案例。在上面的NoSQL数据库类型一节中,描述了四种类型,每种都有自己的数据模型。
每种NoSQL数据库的设计都应考虑到特定的客户情况,并且会因技术原因而组织每种类型的数据库。描述最简单的类型是文档数据库,在其中将基本信息和客户信息都组合在一个JSON文档中是很自然的。在这种情况下,每个SQL列属性将是字段,而客户记录的详细信息将是与每个字段关联的数据值。
例如:Last_name: "Jones", First_name: "Mary", Middle_initial: "S",等等
尝试NoSQL数据库
如果您想尝试NoSQL数据库,MongoDB Atlas是一个不错的起点。Atlas是由MongoDB完全管理的数据库服务,并且在所有领先的云提供商中都可用。阿特拉斯(Atlas)有一个永久的层,您可以用来踢轮胎并了解基础知识。当您准备超越免费套餐时,可以使用代码NOSQLEXPLAINED获得200美元的Atlas积分。
不确定拥有Atlas帐户后该怎么办?前往MongoDB大学,您可以从MongoDB工程师那里获得免费的在线培训。MongoDB大学的课程注册已超过140万。该快速入门教程是另一个伟大的地方开始,因为他们会帮助你起床,并与喜爱的编程语言快速运行。
Nosql和关系型数据库的区别
1.存储方式
关系型数据库是表格式的,因此存储在表的行和列中。他们之间很容易关联协作存储,提取数据很方便。而Nosql数据库则与其相反,他是大块的组合在一起。通常存储在数据集中,就像文档、键值对或者图结构。
2.存储结构
关系型数据库对应的是结构化数据,数据表都预先定义了结构(列的定义),结构描述了数据的形式和内容。这一点对数据建模至关重要,虽然预定义结构带来了可靠性和稳定性,但是修改这些数据比较困难。而Nosql数据库基于动态结构,使用与非结构化数据。因为Nosql数据库是动态结构,可以很容易适应数据类型和结构的变化。
3.存储规范
关系型数据库的数据存储为了更高的规范性,把数据分割为最小的关系表以避免重复,获得精简的空间利用。虽然管理起来很清晰,但是单个操作设计到多张表的时候,数据管理就显得有点麻烦。而Nosql数据存储在平面数据集中,数据经常可能会重复。单个数据库很少被分隔开,而是存储成了一个整体,这样整块数据更加便于读写
4.存储扩展
这可能是两者之间最大的区别,关系型数据库是纵向扩展,也就是说想要提高处理能力,要使用速度更快的计算机。因为数据存储在关系表中,操作的性能瓶颈可能涉及到多个表,需要通过提升计算机性能来克服。虽然有很大的扩展空间,但是最终会达到纵向扩展的上限。而Nosql数据库是横向扩展的,它的存储天然就是分布式的,可以通过给资源池添加更多的普通数据库服务器来分担负载。
横向扩展是已扩展服务器的数量进行高并发的处理(增强处理业务的能力)
根据配置nginx的反向代理,转发服务器(配置的ip)进行轮换处理业务(可加入负载均衡器进行分发请求)
纵向扩展,是增加单机的处理能力,一般增加cpu的处理能力
5.查询方式
关系型数据库通过结构化查询语言来操作数据库(就是我们通常说的SQL)。SQL支持数据库CURD操作的功能非常强大,是业界的标准用法。而Nosql查询以块为单元操作数据,使用的是非结构化查询语言(UnQl),它是没有标准的。关系型数据库表中主键的概念对应Nosql中存储文档的ID。关系型数据库使用预定义优化方式(比如索引)来加快查询操作,而Nosql更简单更精确的数据访问模式。
6.事务
关系型数据库遵循ACID规则(原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)),而Nosql数据库遵循BASE原则(基本可用(Basically Availble)、软/柔性事务(Soft-state )、最终一致性(Eventual Consistency))。由于关系型数据库的数据强一致性,所以对事务的支持很好。关系型数据库支持对事务原子性细粒度控制,并且易于回滚事务。而Nosql数据库是在CAP(一致性、可用性、分区容忍度)中任选两项,因为基于节点的分布式系统中,很难全部满足,所以对事务的支持不是很好,虽然也可以使用事务,但是并不是Nosql的闪光点。
7.性能
关系型数据库为了维护数据的一致性付出了巨大的代价,读写性能比较差。在面对高并发读写性能非常差,面对海量数据的时候效率非常低。而Nosql存储的格式都是key-value类型的,并且存储在内存中,非常容易存储,而且对于数据的 一致性是 弱要求。Nosql无需sql的解析,提高了读写性能。
8.授权方式
关系型数据库通常有SQL Server,Mysql,Oracle。主流的Nosql数据库有redis,memcache,MongoDb。大多数的关系型数据库都是付费的并且价格昂贵,成本较大,而Nosql数据库通常都是开源的。
柔性事务满足Base理论(基本可用、最终一致性)、CAP理论。
刚性事务满足ACID理论。
ACID理论
1. 原子性
原子性是指事务是一个不可再分割的工作单元,事务中的操作要么都发生,要么都不发生。可采用“A向B转账”这个例子来说明解释。在DBMS中,默认情况下一条SQL就是一个单独事务,事务是自动提交的。只有显式的使用start transaction开启一个事务,才能将一个代码块放在事务中执行。
2. 一致性
一致性是指在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。这是说数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性。
如A给B转账,不论转账的事务操作是否成功,其两者的存款总额不变(这是业务逻辑的一致性,至于数据库关系约束的完整性就更好理解了)。
保障机制(也从两方面着手):数据库层面会在一个事务执行之前和之后,数据会符合你设置的约束(唯一约束,外键约束,check约束等)和触发器设置;此外,数据库的内部数据结构(如 B 树索引或双向链表)都必须是正确的。业务的一致性一般由开发人员进行保证,亦可转移至数据库层面。
3. 隔离性
多个事务并发访问时,事务之间是隔离的,一个事务不应该影响其它事务运行效果。
在并发环境中,当不同的事务同时操纵相同的数据时,每个事务都有各自的完整数据空间。由并发事务所做的修改必须与任何其他并发事务所做的修改隔离。事务查看数据更新时,数据所处的状态要么是另一事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看到中间状态的数据。
事务最复杂问题都是由事务隔离性引起的。完全的隔离性是不现实的,完全的隔离性要求数据库同一时间只执行一条事务,这样会严重影响性能。
关于隔离性中的事务隔离等级(事务之间影响),参见相应博文
4. 持久性
这是最好理解的一个特性:持久性,意味着在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。(完成的事务是系统永久的部分,对系统的影响是永久性的,该修改即使出现致命的系统故障也将一直保持)
write ahead logging:SQL Server中使用了WAL(Write-Ahead Logging)技术来保证事务日志的ACID特性,在数据写入到数据库之前,先写入到日志,再将日志记录变更到存储器中。
Redis,Memcache,MongoDb的特点与区别
Redis
优点
- 1.支持多种数据结构,如 string(字符串)、 list(双向链表)、dict(hash表)、set(集合)、zset(排序set)、
- 2.支持持久化操作,可以进行aof及rdb数据持久化到磁盘,从而进行数据备份或数据恢复等操作,较好的防止数据丢失 的手段。
- 3.支持通过Replication进行数据复制,通过master-slave机制,可以实时进行数据的同步复制,支持多级复制和增量复制,master-slave机制是Redis进行HA的重要手段。
- 4.单线程请求,所有命令串行执行,并发情况下不需要考虑数据一致性问题。
- 5.支持pub/sub消息订阅机制,可以用来进行消息订阅与通知。
- 6.支持简单的事务需求,但业界使用场景很少,并不成熟。
缺点
- 1.Redis只能使用单线程,性能受限于CPU性能,故单实例CPU最高才可能达到5-6wQPS每秒(取决于数据结构,数据大小以及服务器硬件性能,日常环境中QPS高峰大约在1-2w左右)。
- 2.支持简单的事务需求,但业界使用场景很少,并不成熟,既是优点也是缺点。
- 3.Redis在string类型上会消耗较多内存,可以使用dict(hash表)压缩存储以降低内存耗用。
Memcache
优点
- 1.Memcached可以利用多核优势,单实例吞吐量极高,可以达到几十万QPS(取决于key、value的字节大小以及服务器硬件性能,日常环境中QPS高峰大约在4-6w左右)。适用于最大程度扛量。
- 2.支持直接配置为session handle。
缺点
- 1只支持简单的key/value数据结构,不像Redis可以支持丰富的数据类型。
- 2.无法进行持久化,数据不能备份,只能用于缓存使用,且重启后数据全部丢失。
- 3.无法进行数据同步,不能将MC中的数据迁移到其他MC实例中。
- 4.Memcached内存分配采用Slab Allocation机制管理内存,value大小分布差异较大时会造成内存利用率降低,并引发低利用率时依然出现踢出等问题。需要用户注重value设计。
MongoDB
优点
- 1.更高的写负载,MongoDB拥有更高的插入速度。
- 2.处理很大的规模的单表,当数据表太大的时候可以很容易的分割表。
- 3.高可用性,设置M-S不仅方便而且很快,MongoDB还可以快速、安全及自动化的实现节点(数据中心)故障转移。
- 4.快速的查询,MongoDB支持二维空间索引,比如管道,因此可以快速及精确的从指定位置获取数据。MongoDB在启动后会将数据库中的数据以文件映射的方式加载到内存中。如果内存资源相当丰富的话,这将极大地提高数据库的查询速度。
- 5.非结构化数据的爆发增长,增加列在有些情况下可能锁定整个数据库,或者增加负载从而导致性能下降,由于MongoDB的弱数据结构模式,添加1个新字段不会对旧表格有任何影响,整个过程会非常快速。
缺点
- 1.不支持事务。
- 2.MongoDB占用空间过大 。
- 3.MongoDB没有成熟的维护工具。
Redis、Memcache和MongoDB的区别
1.性能
- 三者的性能都比较高,总的来讲:Memcache和Redis差不多,要高于MongoDB。
2.便利性
- memcache数据结构单一。
- redis丰富一些,数据操作方面,redis更好一些,较少的网络IO次数。
- mongodb支持丰富的数据表达,索引,最类似关系型数据库,支持的查询语言非常丰富。
3.存储空间
- redis在2.0版本后增加了自己的VM特性,突破物理内存的限制;可以对key value设置过期时间(类似memcache)。
- memcache可以修改最大可用内存,采用LRU算法。
- mongoDB适合大数据量的存储,依赖操作系统VM做内存管理,吃内存也比较厉害,服务不要和别的服务在一起。
4.可用性
- redis,依赖客户端来实现分布式读写;主从复制时,每次从节点重新连接主节点都要依赖整个快照,无增量复制,因性能和效率问题,所以单点问题比较复杂;不支持自动sharding,需要依赖程序设定一致hash 机制。一种替代方案是,不用redis本身的复制机制,采用自己做主动复制(多份存储),或者改成增量复制的方式(需要自己实现),一致性问题和性能的权衡。
- Memcache本身没有数据冗余机制,也没必要;对于故障预防,采用依赖成熟的hash或者环状的算法,解决单点故障引起的抖动问题。
- mongoDB支持master-slave,replicaset(内部采用paxos选举算法,自动故障恢复),auto sharding机制,对客户端屏蔽了故障转移和切分机制。
5.可靠性
- redis支持(快照、AOF):依赖快照进行持久化,aof增强了可靠性的同时,对性能有所影响。
- memcache不支持,通常用在做缓存,提升性能。
- MongoDB从1.8版本开始采用binlog方式支持持久化的可靠性。
6.一致性
- Memcache 在并发场景下,用cas保证一致性。
- redis事务支持比较弱,只能保证事务中的每个操作连续执行。
- mongoDB不支持事务。
7.数据分析
- mongoDB内置了数据分析的功能(mapreduce),其他两者不支持。
8.应用场景
- redis:数据量较小的更性能操作和运算上。
- memcache:用于在动态系统中减少数据库负载,提升性能;做缓存,提高性能(适合读多写少,对于数据量比较大,可以采用sharding)。
- Mongodb:主要解决海量数据的访问效率问题
Redis 简介
Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。
Redis 与其他 key - value 缓存产品有以下三个特点:
- Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
- Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
- Redis支持数据的备份,即master-slave模式的数据备份。
Redis 优势
- 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
- 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
- 原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
- 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。
《Redis架构概述》https://rtoax.blog.csdn.net/article/details/107917429
《Redis与Memcached的对比》https://rtoax.blog.csdn.net/article/details/108614104
《Redis与MySQL的双剑合璧,一文读懂redis》https://rtoax.blog.csdn.net/article/details/108614373
《Redis缓存持久化:RDB持久化和AOF持久化》https://rtoax.blog.csdn.net/article/details/108729843
《Redis:使用Redis的分布式锁》https://rtoax.blog.csdn.net/article/details/108657676
相关NoSQL资源
- NoSQL和SQL之间的主要区别是什么?
- 什么时候应该使用NoSQL数据库?
- NoSQL数据库有4种不同类型?
- NoSQL数据库的优点是什么?
- NoSQL数据建模和模式设计
- 探索NoSQL数据库示例