前言NoSQL指的是非关系型数据库。随着互联网的不断发展,传统的关系型数据库已经无法应对新的互联网模式网站,尤其是超大规模、高并发的SNS类纯动态网站,暴露出很多难以克服的问题,而不是关系型数据库。数据库数据库由于自身的特点,发展非常迅速。NoSQL数据库的出现就是为了解决大规模数据集合多种数据类型带来的挑战,尤其是大数据应用问题。今天主要说一下使用比较多的三种NoSQL:Memcached、Redis、MongoDB。Memcached的优势1.Memcached可以发挥多核的优势,单实例吞吐量极高,可以达到几十万QPS(取决于key和value的字节大小和服务器的性能硬件,日常环境下QPS峰值在4-6w左右)。适用于最大承载能力。2.支持直接配置为会话句柄。缺点1.只支持简单的key/value数据结构,不像Redis可以支持丰富的数据类型。2.不能持久化,不能备份数据,只能做缓存用,重启后数据全部丢失。3、无法进行数据同步,无法将MC中的数据迁移到其他MC实例。4、Memcached内存分配使用SlabAllocation机制来管理内存。当值分布差异较大时,内存使用率会下降,在使用率低的时候仍然会出现踢出等问题。用户需要注意价值设计。Redis的优点1、支持多种数据结构,如string(字符串)、list(双向链表)、dict(哈希表)、set(集合)、zset(排序集合)、hyperloglog(基数估计)。2、支持持久化操作,可以将aof和rdb数据持久化到磁盘,从而进行数据备份或数据恢复操作,更好的防止数据丢失。3.支持通过Replication进行数据复制。通过主从机制,支持实时同步数据复制。支持多级复制和增量复制。主从机制是Redis进行HA的重要手段。4.单线程请求,所有命令串行执行,无需考虑并发情况下的数据一致性问题。5.支持pub/sub消息订阅机制,可用于消息订阅和通知。6、支持简单的交易需求,但行业内使用场景少,不成熟。缺点1、Redis只能使用单线程,其性能受限于CPU性能。所以单实例CPU最高可以达到5-6wQPS/s(根据数据结构、数据大小和服务器硬件性能,日常环境下QPS峰值大概在1-2w左右)。2、支持简单的交易需求,但行业内使用场景少,不成熟,既是优势也是劣势。3、redis在string类型上比较耗内存,可以使用dict(哈希表)压缩存储来减少内存消耗。MongoDB的优点1.更高的写入负载,MongoDB具有更高的插入速度。2.处理大型单表,当数据表过大时,可以轻松拆分表。3、高可用,不仅M-S架设方便快捷,MongoDB还可以快速、安全、自动地实现节点(数据中心)故障转移。4、查询速度快,MongoDB支持管道等二维空间索引,可以快速准确的获取指定位置的数据。MongoDB启动后,数据库中的数据会以文件映射的形式加载到内存中。如果内存资源比较充裕,这将大大提高数据库的查询速度。5、非结构化数据的爆炸式增长,增加列在某些情况下可能会锁住整个数据库,或者增加负载导致性能下降。由于MongoDB弱数据结构模式,增加新字段不会对旧表产生任何影响,整个过程会非常快。缺点1.不支持事务。2、MongoDB占用空间太大。3.MongoDB没有成熟的维护工具。Memcached、Redis、MongoDB的区别1.性能三者的性能都比较高。总的来说:Memcached类似于Redis,但高于MongoDB。2.方便Memcached具有单一的数据结构。Redis更丰富,在数据操作方面,Redis更好,网络IO次数更少。MongoDB支持丰富的数据表达和索引。它最类似于关系数据库,并且支持非常丰富的查询语言。3.存储空间Memcached可以修改最大可用内存,使用LRU算法。Redis在2.0版本后加入了自己的VM特性,突破了物理内存的限制;您可以为键值设置过期时间(类似于memcached)。MongoDB适合存储大量数据。它依赖于操作系统VM进行内存管理,并且消耗更多的内存。该服务不应与其他服务结合使用。4.可用性Memcached本身没有数据冗余机制,也没有必要;在故障预防方面,采用成熟的hash或ring算法解决单点故障带来的抖动问题。Redis依赖客户端实现分布式读写;在主从复制中,每次从节点重新连接到主节点,都必须依赖整个快照,而不是增量复制。由于性能和效率问题,单点问题比较复杂;no支持自动分片,需要依赖程序设置一致的hash机制。一个替代方案是不使用redis本身的复制机制,而是自己做主动复制(多副本存储),或者改为增量复制(需要自己实现),一致性问题和表现。MongoDB支持master-slave,replicaset(内部paxos选举算法,故障自动恢复),autosharding机制,为客户端屏蔽了failover和segmentation机制。5.可靠性Memcached不支持,一般用于缓存提高性能。Redis支持(快照、AOF):依赖快照持久化,aof增强可靠性,影响性能。从1.8版本开始,MongoDB采用了binlog的方式来支持持久化的可靠性。6、一致性Memcached使用cas来保证并发场景下的一致性。Redis对事务的支持比较弱,只能保证事务中各个操作的持续执行。MongoDB不支持事务。7、数据分析MongoDB内置了数据分析功能(mapreduce),其他两个不支持。8、应用场景Memcached:用于动态系统中降低数据库负载,提高性能;做缓存提高性能(适合读多写少,数据量比较大的可以使用sharding)。Redis:高性能运算和小数据量计算。MongoDB:主要解决海量数据的访问效率问题。总结分析1、简单访问key-value(主要是读取)数据,最好使用Memcached。如果要支持数据持久化,量不大,操作很频繁,多种数据类型(如集合,哈希等),高级应用如队列,使用列表类型,使用Redis,但是如果数据量比较大的时候使用MongoDB。2、Memcached的很多客户端都比较成熟稳定,Redis协议比Memcached复杂。Redis不可能比Memcached快吗?但是测试结果基本上是Redis占据绝对优势。3.云数据库Memcached版实例中的数据存放在内存中。当出现宕机、机房断电等意外情况,或者Memcached版实例正常升级维护时,内存中的数据会丢失。因此,ApsaraDBMemcached版不能作为持久化数据存储服务。Redis数据存储在内存中。如果不配置持久化,Redis重启后所有数据都会丢失。因此,需要开启Redis的持久化功能,将数据保存到磁盘中。当Redis重启时,可以从磁盘恢复。数据实现持久化。4、对于Redis和MongoDB,一般称为Redis缓存和MongoDB数据库。Redis主要将数据存储在内存中,其“缓存”性质远大于其“数据存储”性质,数据的增删改查就像变量操作一样简单;MongoDB是一个“数据存储”系统,可以添加很多条件进行增删改查,和SQL数据库一样灵活。5、MongoDB和Redis都是NoSQL,使用结构化数据存储。两者在使用场景上存在一定差异,这主要是由于两者在内存映射过程和持久化上的处理方式不同。MongoDB推荐集群部署,更多考虑集群方案,Redis更侧重于进程顺序写。虽然支持集群,但仅限于主从模式。相关资料Nosql简介Redis、Memchche、MongoDb的区别
