Mongdb的优点:一、快速!拥有适量级内存的Mongdb的性能是很是迅速的,它将热数据存储在物理内存中(而不只仅是索引和少部分数据),使得热数据的读写变得十分快速,从而提升了总体的速度和效率。
二、高扩展性!Mongdb的高可用与集群架构拥有十分高效的扩展性,经过物理机器的增长,以及sharding的增长,Mongdb的扩展将达到一个十分惊人的地步。
三、自身的Failover!Mongdb的副本集配置中,当主库遇到问题,没法继续提供服务的时候,副本集将选举出一个新的主库来继续提供服务。
四、Json的存储格式!Mongdb和Bson存储格式十分适合文档格式的存储和查询。
MongoDB 的劣势:不支持事务操做(最主要的缺点)、MongoDB 占用空间过大、MongoDB 没有如 MySQL 那样成熟的维护工具。
Redis:内存数据库,持久化方式:Redis全部数据库都是放在内存中的,持久化是使用RDB方式或AOF方式。linux
当物理内存够用的时候,Redis > MongoDB > MySQL
当物理内存不够用的时候,Redis 和 MongoDB 都会使用虚拟内存。
实际上若是Redis要开始虚拟内存,那很明显要么加内存条,要么你就该换个数据库了。
可是,MongoDB 不同,只要业务上能保证冷热数据的读写比,使得热数据在物理内存中 mmap 的交换较少,MongoDB 仍是可以保证性能。有人使用 MongoDB 存储了上T的数据。
MySQL,MySQL根本就不须要担忧数据量跟内存下的关系。不过,内存的量跟热数据的关系会极大地影响性能表现。
当物理内存和虚拟内存都不够用的时候,估计除了 MySQL 你没什么好选择了。
其实,从数据存储原理来看,我更倾向于将 MongoDB 归类为硬盘数据库,可是使用了 mmap 做为加速的手段而已。
MongoDB 与 MySQL 命令对比
传统的关系数据库通常由数据库(database)、表(table)、记录(record)三个层次概念组成,MongoDB 是由数据库(database)、集合(collection)、文档对象(document)三个层次组成。MongoDB对于关系型数据库里的表,可是集合中没有列、行和关系概念,这体现了模式自由的特色。
MongoDB (文档型数据库):提供可扩展的高性能数据存储
一、基于分布式文件存储
二、高负载状况下添加更多节点,能够保证服务器性能
三、将数据存储为一个文档
MongoDB 与 MySQL 的比较
一、稳定性
二、索引,索引放在内存中,可以提高随机读写的性能。若是索引不能彻底放在内存,一旦出现随机读写比较高的时候,就会频繁地进行磁盘交换,MongoDB 的性能就会急剧降低
三、占用的空间很大,由于它属于典型空间换时间原则的类型。那么它的磁盘空间比普通数据库会浪费一些,并且到目前为止它尚未实如今线压缩功能,
在 MongoDB 中频繁的进行数据增删改时,若是记录变了,例如数据大小发生了变化,这时候容易产生一些数据碎片,出现碎片引起的结果,一个是索引会出现性能问题,另一个就是在必定的时间后,所占空间会莫明其妙地增大,因此要按期把数据库作修复,按期从新作索引,这样会提高MongoDB 的稳定性和效率。在最新的版本里,它已经在实如今线压缩,估计应该在2.0版左右,应该可以实如今线压缩,能够在后台执行如今repair DataBase 的一些操做。若是那样,就解决了目前困扰咱们的大问题。
四、MongoDB 对数据间的事务关系支持比较弱
五、运维不方便
MongoDB 相对于 MySQL 的优点web
MongoDB 更相似 MySQL,支持字段索引、游标操做,其优点在于查询功能比较强大,擅长查询 JSON 数据,能存储海量数据,可是不支持事务。
MySQL 在大数据量时效率显著降低,MongoDB 更多时候做为关系数据库的一种替代。
内存管理机制
Redis 数据所有存在内存,按期写入磁盘,当内存不够时,能够选择指定的 LRU 算法删除数据。
MongoDB 数据存在内存,由 linux系统 mmap 实现,当内存不够时,只将热点数据放入内存,其余数据存在磁盘。
支持的数据结构
Redis 支持的数据结构丰富,包括hash、set、list等。
MongoDB 数据结构比较单一,可是支持丰富的数据表达,索引,最相似关系型数据库,支持的查询语言很是丰富。
集群:MongoDB 集群技术比较成熟,Redis从3.0开始支持集群。两者都可支持持久化。
不适用场景:一、须要使用复杂sql的操做;二、事务性系统;算法
MySQL 是持久化存储,存放在磁盘里面,检索的话,会涉及到必定的 IO,为了解决这个瓶颈,因而出现了缓存,好比如今用的最多的 memcached(简称mc)。首先,用户访问mc,若是未命中,就去访问 MySQL,以后像内存和硬盘同样,把数据复制到mc一部分。Redis 和mc都是缓存,而且都是驻留在内存中运行的,这大大提高了高数据量web访问的访问速度。然而mc只是提供了简单的数据结构,好比 string存储;Redis却提供了大量的数据结构,好比string、list、set、hashset、sorted set这些,这使得用户方便了好多,毕竟封装了一层实用的功能,同时实现了一样的效果,固然用Redis而慢慢舍弃mc。
内存和硬盘的关系,硬盘放置主体数据用于持久化存储,而内存则是当前运行的那部分数据,CPU访问内存而不是磁盘,这大大提高了运行的速度,固然这是基于程序的局部化访问原理。
推理到 Redis + MySQL,它是内存+磁盘关系的一个映射,MySQL 放在磁盘,Redis放在内存,这样的话,web应用每次只访问Redis,若是没有找到想要的数据,才去访问 MySQL。
然而 Redis + MySQL 和内存+磁盘的用法最好是不一样的。
前者是内存数据库,数据保存在内存中,固然速度快。
后者是关系型数据库,功能强大,数据访问也就慢。
像memcache,MongoDB,Redis,都属于No SQL系列。
不是一个类型的东西,应用场景也不太同样,仍是要看你的需求来决定。sql
LVS的优势:抗负载能力强,工做在第4层仅作分发之用,没有流量产生,这也决定了它在负载均衡软件里的性能最强,同时保证了均衡器的IO性能不会受大流量的影响。工做稳定,自身有完整的双机热备方案,如LVS+Keepalived和LVS+Hear+Beat;应用范围广,能够对全部应用作负载均衡,配置性能低,不须要太多的接触,大大减小了人为出错的概率。
LVS的缺点:软件自己不支持正则,不能作动静分离,若网站应用较庞大,LVS+Keepalived就较复杂。
Nginx的优势:工做在第7层,能够针对http应用作一些分流的策略,好比针对域名,目录结构等,它的正则比Haproxy更强大灵活;对网络依赖小,理论上能ping通就能进行负载功能,安装和配置较简单,测试较方便,能够承担高的负载压力且稳定,通常能支撑超过几万次的并发量;能够经过端口检测到服务器内部故障,如根据服务器处理网页返回的状态码,超时等等;且会把返回错误的请求从新提交到另外一个节点;同时是功能强大的web应用服务器,在处理静态页面、抗高并发方面相对Apache有优点。
Nginx的缺点:不支持url来检测,仅支持http、https和email,好比用户正在上传一个文件,而处理该上传的节点恰好在上传过程当中出现故障,Nginx会把上传切到另外一台服务器从新处理,而LVS就直接断掉了,若是是上传一个很大的文件或者很重要的文件的话,用户可能会所以而不满。Nginx和Session的保持,Cookie的引导能力较弱。
Haproxy的优势:一、HAProxy是支持虚拟主机的,能够工做在四、7层(支持多网段);二、HAProxy的优势可以补充Nginx的一些缺点,好比支持Session的保持,Cookie的引导;同时支持经过获取指定的url来检测后端服务器的状态。三、HAProxy跟LVS相似,自己就只是一款负载均衡软件;单纯从效率上来说HAProxy会比Nginx有更出色的负载均衡速度,在并发处理上也是优于Nginx的。 四、HAProxy支持TCP协议的负载均衡转发,能够对MySQL读进行负载均衡,对后端的MySQL节点进行检测和负载均衡,你们能够用LVS+Keepalived对MySQL主从作负载均衡。
Haproxy的缺点:不支持POP/SMTP协议;不支持HTTP cache功能。如今很多开源的lb项目,都或多或少具有HTTP cache功能; 重载配置的功能须要重启进程,虽然也是soft restart,但没有Nginx的reaload更为平滑和友好;多进程模式支持不够好。数据库