redis与mongodb比较
Redis、memcache、MongoDB 对比
项目 | Redis | MongoDB |
---|---|---|
介绍 | Redis 是内存中的数据结构存储,用作数据库,缓存和消息代理。 | MongoDB 是遵循文档存储结构的最流行的 NoSQL 数据库之一。 |
主数据库模型 | Redis 遵循键值存储模型。 | MongoDB 遵循文档存储模型。 |
许可 | Redis 是基于订阅和开源的。 | MongoDB 可以免费使用和开源。 |
实现语言 | Redis 是用 C 语言编写和实现的。 | MongoDB 是用 C ++语言编写和实现的。 |
二级索引 | 没有 | 是 |
API 和其他访问方法 | Redis 遵循专有协议。 | MongoDB 遵循使用 JSON 的专有协议。 |
服务器端脚本 | LUA | JavaScript 的 |
分区方法 | 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 |
可操作性 | 丰富的数据表达、索引;最类似于关系数据库,支持丰富的查询语言 | 数据丰富,较少的IO | MongoDB优于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: 主要解决海量数据的访问效率问题。
支持情况 | 差 | 一般 | 好 | 极好 |
---|---|---|---|---|
数据规模 | redis | ES | Mongo | HBase |
查询性能 | HBase | ES | Mongo | redis |
写入性能 | ES | Mongo | HBase | redis |
复杂查询、检索功能 | redis | HBase | Mongo | ES |