Table of Contentshtml
关系型数据库(Relational Database)mysql
什么是关系数据库nginx
什么是SQL?redis
关系数据库的结构算法
关系模型sql
关系数据库的好处mongodb
数据一致性数据库
隔离性和原子性编程
关系型数据库(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