Redis、Memcache 和 MongoDB 的区别

Redis、Memcache 和 MongoDB 的区别

本文转载自:原文链接

Memcached

Memcached 的优点:

Memcached 可以利用多核优势,单实例吞吐量极高,可以达到几十万 QPS(取决于 key、value 的字节大小以及服务器硬件性能,日常环境中 QPS 高峰大约在 4-6w 左右)。适用于最大程度扛量。
支持直接配置为 session handle。

Memcached 的局限性:

  • 只支持简单的 key/value 数据结构,不像 Redis 可以支持丰富的数据类型。
  • 无法进行持久化,数据不能备份,只能用于缓存使用,且重启后数据全部丢失。
  • 无法进行数据同步,不能将 MC 中的数据迁移到其他 MC 实例中。
  • Memcached 内存分配采用 Slab Allocation 机制管理内存,value 大小分布差异较大时会造成内存利用率降低,并引发低利用率时依然出现踢出等问题。需要用户注重 value 设计。

Redis

Redis 的优点:

  • 支持多种数据结构,如 string(字符串)、 list(双向链表)、dict(hash表)、set(集合)、zset(排序set)、hyperloglog(基数估算)
  • 支持持久化操作,可以进行 aof 及 rdb 数据持久化到磁盘,从而进行数据备份或数据恢复等操作,较好的防止数据丢失的手段。
  • 支持通过 Replication 进行数据复制,通过 master-slave 机制,可以实时进行数据的同步复制,支持多级复制和增量复制,master-slave 机制是 Redis 进行 HA 的重要手段。
  • 单线程请求,所有命令串行执行,并发情况下不需要考虑数据一致性问题。
  • 支持 pub/sub 消息订阅机制,可以用来进行消息订阅与通知。
  • 支持简单的事务需求,但业界使用场景很少,并不成熟。

Redis 的局限性:

Redis 只能使用单线程,性能受限于 CPU 性能,故单实例 CPU 最高才可能达到 5-6wQPS 每秒(取决于数据结构,数据大小以及服务器硬件性能,日常环境中 QPS 高峰大约在 1-2w 左右)。

支持简单的事务需求,但业界使用场景很少,并不成熟,既是优点也是缺点。
Redis 在 string 类型上会消耗较多内存,可以使用 dict(hash表)压缩存储以降低内存耗用。

Mc 和 Redis 都是 Key-Value 类型,不适合在不同数据集之间建立关系,也不适合进行查询搜索。比如 redis 的 keys pattern 这种匹配操作,对 redis 的性能是灾难。

mongoDB

mongoDB 是一种文档性的数据库。先解释一下文档的数据库,即可以存放 xml、json、bson 类型系那个的数据。

这些数据具备自述性(self-describing),呈现分层的树状数据结构。redis 可以用 hash 存放简单关系型数据。

mongoDB 存放 json 格式数据。

适合场景:事件记录、内容管理或者博客平台,比如评论系统。

(1)mongodb 持久化原理

mongodb 与 mysql 不同,mysql 的每一次更新操作都会直接写入硬盘,但是 mongo 不会,做为内存型数据库,数据操作会先写入内存,然后再会持久化到硬盘中去,那么 mongo 是如何持久化的呢

mongodb 在启动时,专门初始化一个线程不断循环(除非应用 crash 掉),用于在一定时间周期内来从 defer 队列中获取要持久化的数据并写入到磁盘的 journal (日志)和 mongofile (数据)处,当然因为它不是在用户添加记录时就写到磁盘上,所以按 mongodb 开发者说,它不会造成性能上的损耗,因为看过代码发现,当进行 CUD 操作时,记录( Record 类型)都被放入到 defer 队列中以供延时批量(groupcommit)提交写入,但相信其中时间周期参数是个要认真考量的参数,系统为 90 毫秒,如果该值更低的话,可能会造成频繁磁盘操作,过高又会造成系统宕机时数据丢失过。

(2)什么是 NoSQL 数据库?NoSQL 和 RDBMS 有什么区别?在哪些情况下使用和不使用 NoSQL 数据库?

NoSQL是非关系型数据库,NoSQL = Not Only SQL。
关系型数据库采用的结构化的数据,NoSQL采用的是键值对的方式存储数据。
在处理非结构化/半结构化的大数据时;在水平方向上进行扩展时;随时应对动态增加的数据项时可以优先考虑使用NoSQL数据库。
在考虑数据库的成熟度;支持;分析和商业智能;管理及专业性等问题时,应优先考虑关系型数据库。

(3)MySQL 和 MongoDB 之间最基本的区别是什么?

关系型数据库与非关系型数据库的区别,即数据存储结构的不同。

(4)MongoDB 的特点是什么?

(1)面向文档(2)高性能(3)高可用(4)易扩展(5)丰富的查询语言

(5)MongoDB 支持存储过程吗?如果支持的话,怎么用?

MongoDB 支持存储过程,它是 javascript 写的,保存在 db.system.js 表中。

(6)如何理解 MongoDB 中的 GridFS 机制,MongoDB 为何使用 GridFS 来存储文件?

GridFS 是一种将大型文件存储在 MongoDB 中的文件规范。使用 GridFS 可以将大文件分隔成多个小文档存放,这样我们能够有效的保存大文档,而且解决了 BSON 对象有限制的问题。

(7)为什么 MongoDB 的数据文件很大?

MongoDB 采用的预分配空间的方式来防止文件碎片。

(8)当更新一个正在被迁移的块(Chunk)上的文档时会发生什么?

更新操作会立即发生在旧的块(Chunk)上,然后更改才会在所有权转移前复制到新的分片上。

(9)MongoDB在A:{B,C}上建立索引,查询A:{B,C}和A:{C,B}都会使用索引吗?

不会,只会在A:{B,C}上使用索引。

(10)如果一个分片(Shard)停止或很慢的时候,发起一个查询会怎样?

如果一个分片停止了,除非查询设置了“Partial”选项,否则查询会返回一个错误。如果一个分片响应很慢,MongoDB会等待它的响应。

Redis、Memcache 和 MongoDB 的区别

从以下几个维度,对 redis、memcache、mongoDB 做了对比,

1、性能

都比较高,性能对我们来说应该都不是瓶颈

总体来讲,TPS 方面 redis 和 memcache 差不多,要大于 mongodb

2、操作的便利性

memcache 数据结构单一

redis 丰富一些,数据操作方面,redis 更好一些,较少的网络 IO 次数

mongodb 支持丰富的数据表达,索引,最类似关系型数据库,支持的查询语言非常丰富

3、内存空间的大小和数据量的大小

redis 在 2.0 版本后增加了自己的 VM 特性,突破物理内存的限制;可以对 key value 设置过期时间(类似 memcache)

memcache 可以修改最大可用内存,采用 LRU 算法

mongoDB适合大数据量的存储,依赖操作系统 VM 做内存管理,吃内存也比较厉害,服务不要和别的服务在一起

4、可用性(单点问题)

对于单点问题,

redis,依赖客户端来实现分布式读写;主从复制时,每次从节点重新连接主节点都要依赖整个快照,无增量复制,因性能和效率问题,

所以单点问题比较复杂;不支持自动 sharding,需要依赖程序设定一致hash 机制。

一种替代方案是,不用 redis 本身的复制机制,采用自己做主动复制(多份存储),或者改成增量复制的方式(需要自己实现),一致性问题和性能的权衡

Memcache 本身没有数据冗余机制,也没必要;对于故障预防,采用依赖成熟的hash或者环状的算法,解决单点故障引起的抖动问题。

mongoDB 支持 master-slave,replicaset(内部采用 paxos 选举算法,自动故障恢复),auto sharding 机制,对客户端屏蔽了故障转移和切分机制。

5、可靠性(持久化)

对于数据持久化和数据恢复,

redis 支持(快照、AOF):依赖快照进行持久化,aof 增强了可靠性的同时,对性能有所影响

memcache 不支持,通常用在做缓存,提升性能;

MongoDB 从1.8版本开始采用 binlog 方式支持持久化的可靠性

6、数据一致性(事务支持)

Memcache 在并发场景下,用 cas 保证一致性

redis 事务支持比较弱,只能保证事务中的每个操作连续执行

mongoDB不支持事务

7、数据分析

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

8、应用场景

redis:数据量较小的更性能操作和运算上

memcache:用于在动态系统中减少数据库负载,提升性能;做缓存,提高性能(适合读多写少,对于数据量比较大,可以采用 sharding)

MongoDB: 主要解决海量数据的访问效率问题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值