• redis与mongodb比较

  • Redis、memcache、MongoDB 对比

项目RedisMongoDB
介绍Redis 是内存中的数据结构存储,用作数据库,缓存和消息代理。MongoDB 是遵循文档存储结构的最流行的 NoSQL 数据库之一。
主数据库模型Redis 遵循键值存储模型。MongoDB 遵循文档存储模型。
许可Redis 是基于订阅和开源的。MongoDB 可以免费使用和开源。
实现语言Redis 是用 C 语言编写和实现的。MongoDB 是用 C ++语言编写和实现的。
二级索引没有
API 和其他访问方法Redis 遵循专有协议。MongoDB 遵循使用 JSON 的专有协议。
服务器端脚本LUAJavaScript 的
分区方法Redis 使用 Sharding 进行分区。MongoDB 也使用 Sharding 进行分区。
复制方法Redis 遵循主从复制。MongoDB 也遵循主从复制。
可操作性数据操作方面,redis更好一些,较少的网络IO次数支持丰富的数据表达,索引,最类似关系型数据库,支持的查询语言非常丰富
MapReduce没有
一致性概念最终的一致性和即时一致性最终的一致性
交易概念乐观锁定,命令块和脚本的原子执行。没有
性能依赖内存,TPS较高依赖内存,TPS较高
高并发50个并发执行100000 个请求,读的速度是110000 次/s,写的速度是81000次/s善于处理高并发
持久化支持持久化操作,可以进行aof及rdb数据持久化到磁盘,从而进行数据备份或数据恢复等操作,较好的防止数据丢失的手段。数据操作会先写入内存,然后再会持久化到硬盘中去,mongodb在启动时,专门初始化一个线程不断循环(除非应用crash掉),用于在一定时间周期内来从defer队列中获取要持久化的数据并写入到磁盘的journal(日志)和mongofile(数据)处,当然因为它不是在用户添加记录时就写到磁盘上,所以按mongodb开发者说,它不会造成性能上的损耗,因为当进行CUD操作时,记录(Record类型)都被放入到defer队列中以供延时批量(groupcommit)提交写入,但相信其中时间周期参数是个要认真考量的参数,系统为90毫秒,如果该值更低的话,可能会造成频繁磁盘操作,过高又会造成系统宕机时数据丢失过。
内存与数据量redis在2.0版本后增加了自己的VM特性,突破物理内存的限制;可以对key value设置过期时间(类似memcache)适合大数据量存储,依赖系统虚拟内存管理,采用镜像文件存储;内存占有率比较高,官方建议独立部署在64位系统(32位有最大2.5G文件限制,64位没有改限制)
内存管理Redis 数据全部存在内存,定期写入磁盘,当内存不够时,可以选择指定的 LRU 算法删除数据。MongoDB 数据会优先存于内存,当内存不够时,只将热点数据放入内存,其他数据存在磁盘。
可用性依赖客户端来实现分布式读写;主从复制时,每次从节点重新连接主节点都要依赖整个快照,无增量复制;不支持自动sharding,需要依赖程序设定一致hash机制支持master-slave,replicaset(内部采用paxos选举算法,自动故障恢复),auto sharding机制,对客户端屏蔽了故障转移和切分机制
用户权限简单的基于密码的访问控制。用户和角色的访问权限。
特色Redis 被评为世界上最快的数据库。它降低了应用程序的复杂性,简化了开发,加快了产品上市时间,并通过其有远见的数据结构和模块为开发人员提供了前所未有的灵MongoDB 被认为是下一代数据库。它成功地帮助许多企业通过提供大数据来改变他们的行业。世界上最先进的组织,从最前沿的创业公司到最大的公司,使用 MongoDB 以极低的成本创建前所未有的应用程序。
比较优势Redis 是一种内存数据库平台,支持各种数据结构,如字符串,散列,集合,列表,有序集,位图,超级日志和地理空间索引。Redis 通过监督分片,重新分片,迁移的所有操作,以完全自动化的方式提供轻松扩展。它还包括持久性,即时自动故障检测,备份和恢复以及跨机架,区域,数据中心,区域和云平台的内存复制。MongoDB 提供了当今最好的传统数据库以及当今应用程序所需的灵活性,扩展性和性能。MongoDB 是一个巨大的想法数据库。MongoDB 保留了 Relational 数据库最有价值的特性,即强一致性,表达式查询语言和二级索引。它有助于开发人员比 NoSQL 数据库更快地构建功能强大的应用程序
市场指标Redis Labs 由全球 60000 多家客户组成,在 NoSQL,内存和运营数据库方面的顶级分析报告中一直名列前茅。Redis 被评为否。1 个云数据库,Docker 中的 1 号数据库,1 号 NoSQL 数据存储区,容器中最流行的 NoSQL 数据库。下载量达到 2000 万(每天下载量达到数千次)。超过 2,000 名客户,包括超过三分之一的财富 100 强。在 Forrester Wave 中被评为领导者:大数据 NoSQL,2016 年第 3 季度。在数据库引擎排名中排名最高的非关系型数据库

1 MongoDB简介

MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。
 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
非关系型数据库 (NoSql),Mongo DB 很好的实现了面向对象的思想 (OO 思想), 在Mongo DB 中 每一条记录都是一个 Document 对象。Mongo DB 最大的优势在于所有的数据持久操作都无需开发人员手动编写 SQL 语句, 直接调用方法就可以轻松的实现 CRUD 操作.

1.1 MongoDB 的特点

  • 高性能、易部署、易使用,存储数据非常方便。主要功能特性有:
  • 面向集合存储,易存储对象类型的数据。
  • 模式自由。
  • 支持动态查询。
  • 支持完全索引,包含内部对象。
  • 支持查询。
  • 支持复制和故障恢复。
  • 使用高效的二进制数据存储,包括大型对象(如视频等)。
  • 自动处理碎片,以支持云计算层次的扩展性
  • 支持 Python,PHP,Ruby,Java,C,C#,Javascript,Perl 及 C++ 语言的驱动程序,社区中也提供了对 Erlang 及. NET 等平台的驱动程序。
  • 文件存储格式为 BSON(一种 JSON 的扩展)。
  • 可通过网络访问。

1.2 MongoDB 的功能

  • 面向集合的存储:适合存储对象及 JSON 形式的数据。
  • 动态查询:Mongo 支持丰富的查询表达式。查询指令使用 JSON 形式的标记,可轻易查询文档中内嵌的对象及数组。
  • 完整的索引支持:包括文档内嵌对象及数组。Mongo 的查询优化器会分析查询表达式,并生成一个高效的查询计划。
  • 查询监视:Mongo 包含一个监视工具用于分析数据库操作的性能。
  • 复制及自动故障转移:Mongo 数据库支持服务器之间的数据复制,支持主 – 从模式及服务器之间的相互复制。复制的主要目标是提供冗余及自动故障转移。
  • 高效的传统存储方式:支持二进制数据及大型对象(如照片或图片)
  • 自动分片以支持云级别的伸缩性:自动分片功能支持水平的数据库集群,可动态添加额外的机器。

1.3 MongoDB 的适用场景

  • 网站数据:Mongo 非常适合实时的插入,更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性。
  • 缓存:由于性能很高,Mongo 也适合作为信息基础设施的缓存层。在系统重启之后,由 Mongo 搭建的持久化缓存层可以避免下层的数据源 过载。
  • 大尺寸,低价值的数据:使用传统的关系型数据库存储一些数据时可能会比较昂贵,在此之前,很多时候程序员往往会选择传统的文件进行存储。
  • 高伸缩性的场景:Mongo 非常适合由数十或数百台服务器组成的数据库。Mongo的路线图中已经包含对 MapReduce 引擎的内置支持。
  • 用于对象及 JSON 数据的存储:Mongo 的 BSON 数据格式非常适合文档化格式的存储及查询。

2 Redis、MongoDB 对比

mongodb 和 memcached 不是一个范畴内的东西。mongodb 是文档型的非关系型数据库,其优势在于查询功能比较强大,能存储海量数据。和 memcached 更为接近的是 Redis。它们都是内存型数据库,数据保存在内存中,通过 tcp 直接存取,优势是速度快,并发高,缺点是数据类型有限,查询功能不强,一般用作缓存。

MongoDB和Redis都是NoSQL,采用结构型数据存储。二者在使用场景中,存在一定的区别,这也主要由于二者在内存映射的处理过程,持久化的处理方法不同。MongoDB建议集群部署,更多的考虑到集群方案,Redis更偏重于进程顺序写入,虽然支持集群,也仅限于主-从模式。

指标MongoDB(v2.4.9)Redis(v2.4.17)比较说明
实现语言C++C/C++
协议BSON、自定义二进制类Telnet
性能依赖内存,TPS较高依赖内存,TPS非常高Redis优于MongoDB
可操作性丰富的数据表达、索引;最类似于关系数据库,支持丰富的查询语言数据丰富,较少的IOMongoDB优于Redis
内存及存储适合大数据量存储,依赖系统虚拟内存管理,采用镜像文件存储;内存占有率比较高,官方建议独立部署在64位系统(32位有最大2.5G文件限制,64位没有改限制)Redis2.0后增加虚拟内存特性,突破物理内存限制;数据可以设置时效性,类似于memcache不同的应用角度看,各有优势
可用性支持master-slave,replicaset(内部采用paxos选举算法,自动故障恢复),auto sharding机制,对客户端屏蔽了故障转移和切分机制依赖客户端来实现分布式读写;主从复制时,每次从节点重新连接主节点都要依赖整个快照,无增量复制;不支持自动sharding,需要依赖程序设定一致hash机制MongoDB优于Redis;单点问题上,MongoDB应用简单,相对用户透明,Redis比较复杂,需要客户端主动解决。(MongoDB 一般会使用replica sets和sharding功能结合,replica sets侧重高可用性及高可靠性,而sharding侧重于性能、易扩展)
可靠性从1.8版本后,采用binlog方式(MySQL同样采用该方式)支持持久化,增加可靠性依赖快照进行持久化;AOF增强可靠性;增强可靠性的同时,影响访问性能MongoDB优于Redis
一致性不支持事物,靠客户端自身保证支持事物,比较弱,仅能保证事物中的操作按顺序执行Redis优于MongoDB
数据分析内置数据分析功能(mapreduce)不支持MongoDB优于Redis
应用场景海量数据的访问效率提升较小数据量的性能及运算MongoDB优于Redis

2.1 性能

Redis大于 mongodb。

2.2 操作的便利性

  • Redis 丰富一些,数据操作方面,Redis 更好一些,较少的网络 IO 次数。
  • mongodb 支持丰富的数据表达,索引,最类似关系型数据库,支持的查询语言非常丰富。

2.3 内存空间的大小和数据量的大小

  • Redis 在 2.0 版本后增加了自己的 VM 特性,突破物理内存的限制;可以对key value 设置过期时间(类似 memcache)。
  • mongoDB 适合大数据量的存储,依赖操作系统 VM 做内存管理,吃内存也比较厉害,服务不要和别的服务在一起。

2.4 可用性(单点问题)

  • Redis 对于单点问题,依赖客户端来实现分布式读写;主从复制时,每次从节点重新连接主节点都要依赖整个快照, 无增量复制,因性能和效率问题,所以单点问题比较复杂;不支持自动 sharding, 需要依赖程序设定一致 hash 机制。一种替代方案是,不用 Redis 本身的复制机制,采用自己做主动复制(多份存储),或者改成增量复制的方式(需要自己实现),一致性问题和性能的权衡。
  • mongoDB 支持 master-slave,replicaset(内部采用 paxos 选举算法,自动故障恢复),auto sharding 机制,对客户端屏蔽了故障转移和切分机制。

2.5 可靠性(持久化)

  • 对于数据持久化和数据恢复,Redis 支持(快照、AOF):依赖快照进行持久化,aof 增强了可靠性的同时,对性能有所影响。
  • MongoDB 从 1.8 版本开始采用 binlog 方式支持持久化的可靠性。

2.6 数据一致性(事务支持)

  • Redis 事务支持比较弱,只能保证事务中的每个操作连续执行。
  • mongoDB 不支持事务。

2.7 数据分析

mongoDB 内置了数据分析的功能 (mapreduce), 其他不支持。

2.8 应用场景

  • Redis:数据量较小的更性能操作和运算上。
  • MongoDB: 主要解决海量数据的访问效率问题。
支持情况一般极好
数据规模redisESMongoHBase
查询性能HBaseESMongoredis
写入性能ESMongoHBaseredis
复杂查询、检索功能redisHBaseMongoES