关系型数据库和非关系型数据库(MongoDB和redis对比)

1.关系型数据库和非关系型数据库的区别(优缺点,适用环境)
2.博客为什么是mongodb

1.关系型

代表数据库系统:MySQL, SQL Server, Oracle,
关系型数据库的表是二维表,结构稳定,修改不易。经常需要联表查询。

优点:
1.查询能力高,可以操作很复杂的查询
2.一致性高。由于并发高,在数据同步的时候一般采用锁来保证数据的可靠性(还有时间戳什么的方法),在处理数据的时候对表进行封锁来保证操作的时候其他的操作不能改变当前查询范围内的数据的值。
3.由于表具有逻辑性,易于理解。
既然它现在有些过气了(2333)自然有原因,随着大数据时代的到来,关系型数据库的严谨变得有些不适用:
1.不适用高并发读写
2.不适用海量数据高效读写
3.层次多,扩展性低
4.维护一致性开销大
5.涉及联表查询,复杂,慢

2.非关系型

非关系型数据库主要是使用key-value的方式存储数据的,即是『no relational』,这是『显然』区别于关系型数据库的特点之一。由于数据间没有关联性,相对来说层级扁平。
优点:
1.由于数据之间没有关系,所以易扩展,也易于查询
2.数据结构灵活,每个数据都可以有不同的结构
3.由于降低了一致性的要求,所以查询速度更快

非关系型数据库的产生是因为随着网站的进化,并发性增加,扩展性高,一致性要求降低。这样关系型数据库最重要的一致性维护就显得有点多余,并且消耗着性能。因此有了非关系型数据库,它可以算是关系型数据库的一种弱化的结果,在海量数据存储和查询上更胜一筹。
两种数据库没有好坏之分,只是使用的环境不一样。关系型数据库可以说是更严谨的,可靠性更强的数据库,在对于数据精度要求高的环境,比如说银行系统这样自然是像mysql这样的数据库适合。非关系型数据库胜在处理大数据的速度,但是对于数据的准确度没有那么高,对于操作量大的环境比如当前大部分web2.0的网站更加适用一些。

3.Why mongodb

主要比较下mongodb和redis。

MongoDB更类似MySQL,支持字段索引、游标操作,其优势在于查询功能比较强大,擅长查询JSON数据,能存储海量数据,但是不支持事务。

Mysql在大数据量时效率显著下降,MongoDB更多时候作为关系数据库的一种替代。

mongodb更吃内存,因为当mongo发现内存不够的时候,是以2的指数级别来申请内存的。所以一般都建议把mongodb单独放。
其实可以说redis更像缓存机制,cookie,也可以设定数据的过期时间,当然也可以永久存储(但是好像稍逊色?)。mongodb是文档式的存储,在类似于博客系统这样,可以把每篇博客,包括日期,评论什么的都当做一篇文档来看。这样在博客数据库选择的时候,自然是mongodb更加贴近一些(如果选择非关系型数据库), 也相较于redis更适合永久存储

内存管理机制

Redis数据全部存在内存,定期写入磁盘,当内存不够时,可以选择指定的LRU算法删除数据。

MongoDB和mysql一样,只是把索引文件放到内存中。由linux系统mmap实现,当内存不够时,只将热点数据放入内存,其他数据存在磁盘。
(注:mmap (一种内存映射文件的方法) mmap将一个文件或者其它对象映射进内存。文件被映射到多个页上,如果文件的大小不是所有页的大小之和,最后一个页不被使用的空间将会清零。mmap在用户空间映射调用系统中作用很大。)

支持的数据结构

Redis支持的数据结构丰富,包括hash、set、list等。

MongoDB数据结构比较单一,但是支持丰富的数据表达,索引,最类似关系型数据库,支持的查询语言非常丰富。

性能

redis更适用于较小数据量的性能及运算

mongodb则在海量数据的访问下性能更优

可靠性

二者均支持持久化。

集群

MongoDB集群技术比较成熟,Redis从3.0开始支持集群。

不适用场景

Ø 需要使用复杂sql的操作

Ø 事务性系统

转载
原文

Redis 最佳应用场景:适用于数据变化快且数据库大小可遇见(适合内存容量)的应用程序。

例如:股票价格、数据分析、实时数据搜集、实时通讯。

MongoDB:最佳应用场景:适用于需要动态查询支持;需要使用索引而不是 map/reduce功能;需要对大数据库有性能要求;需要使用 CouchDB但因为数据改变太频繁而占满内存的应用程序。

例如:你本打算采用 MySQL或 PostgreSQL,但因为它们本身自带的预定义栏让你望而却步。

简说mmap:

mmap系统调用并不是完全为了用于共享内存而设计的。它本身提供了不同于一般对普通文件的访问方式,进程可以像读写内存一样对普通文件进行操作。
mmap 系统调用使得进程之间通过映射同一个普通文件实现共享内存。普通文件被映射到进程地址空间后,进程可以像访问普通内存一样对文件进行访问,不必再调用。 read(),write()等操作。mmap并不分配空间, 只是将文件映射到调用进程的地址空间里, 然后你就可以用memcpy(内存拷贝)等操作写文件, 而不用write()了.写完后用msync()同步一下(msync():一般说来,进程在映射空间的对共享内容的改变并不直接写回到磁盘文件中,往往在调用munmap(解除映射关系)后才执行该操作。可以通过调用msync()实现磁盘上文件内容与共享内存区的内容一致), 你所写的内容就保存到文件里了. 不过这种方式没办法增加文件的长度, 因为要映射的长度在调用mmap()的时候就决定了。

大数据处理的模型:MapReduce

Mapreduce是一个分布式运算程序的编程框架,是用户开发“基于hadoop的数据分析应用”的核心框架;
Mapreduce核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在一个hadoop集群上

MapReduce的处理过程分为两个步骤:map和reduce。map和reduce函数是要执行的任务,由master分配任务给worker执行。map函数读取被分配的输入数据片段,输出中间key/value pair值的集合,reduce函数收集具有相同中间key值的value值,合并这些value值,形成一个较小的value值的集合。
MapReduce详解
从零开始学Hadoop——浅析MapReduce(一)

猜你喜欢

转载自blog.csdn.net/qq_33915826/article/details/80386321