Redis
优点
- 支持多种数据结构:string list set hash zset hyperloglog
- 支持持久化操作:RDB(默认)和 AOF(自选)
- 支持 Replication 数据复制:通过 master-slave 机制可以实时进行数据的同步复制,支持多级复制和增量复制
- 单线程请求,多有命令串行执行,并发情况下不考虑数据一致性的问题
- 支持 pub/sub 消息订阅机制
- 支持简单的事物请求(不成熟)
缺点
- 只能使用单线程,性能受限于 CPU
- 事务机制不成熟
- string 类型消耗较多的内存,但是可以用dict(hash表)压缩存储以降低内存消耗
- Key-Value 类型,不适合在不同事数据之间建立关系,也不适合查询搜索
MongoDB
优点
- 文档型数据库(存放 xml、json 和 bson 数据类型)
- 动态查询
- 查询语言丰富
- 支持索引,扩展到内部对象和内嵌数组
- 更新快速,对二进制文件存储效率极高
- 复制和故障切换支持
- MapReduce 支持复杂聚合
- 查询记录分析
缺点
- 不支持事务,只能靠客户端进行保证
- MongoDB 占用空间过大
- 32bit 系统最大支持 2.5GB 数据以内,64bit 系统不受限制
- 维护工具不太成熟
性能指标对比
指标 | MongoDB | Redis | 比较 |
---|---|---|---|
实现语言 | C++ | C/C++ | - |
协议 | BSON、自定义二进制 | 类Telnet | - |
性能 | 依赖内存,TPS较高 | 依赖内存,TPS非常高 | Redis 优于 MongoDB |
操控性 | 1. 丰富数据表达、索引; 2. 类似于关系型数据库支持丰富的查询语言 | 数据丰富,IO 较少 | Redis 优于 MongoDB |
内存及存储 | 1. 适合大数据存储,依赖系统虚拟内存管理,采用镜像文件存储; 2. 32bit 系统最大2.5GB,64bit 无限制 | 1. Redis2.0 后增加虚拟内存特性,突破物理内存限制; 2. 数据可以设置时效性,类似于memcache | 不同的应用角度看,各有优势 |
可用性 | 支持 master-slave,replicaset(内部采用 paxos 选举算法,自动故障恢复),auto sharding 机制,对客户端屏蔽了故障转移和切分机制 | 1. 依赖客户端来实现分布式读写; 2. 主从复制时,每次从节点重新连接主节点都要依赖整个快照,无增量复制; 3. 不支持自动 sharding,需要依赖程序设定一致 hash 机制 | 1. MongoDB 优于 Redis; 2. 单点问题上,MongoDB 应用简单,相对用户透明,Redis 比较复杂,需要客户端主动解决。(MongoDB 一般会使用 replica sets 和 sharding 功能结合,replica sets 侧重高可用性及高可靠性,而 sharding 侧重于性) |
可靠性 | 1.8版本后采用 binlog 方式(同 MySQL 一样),支持持久化,增加可靠性 | 1. 依赖快照进行持久化; 2. AOF 增强可靠性; 3. 增强可靠性的同时,影响访问性能 | MongoDB 优于 Redis |
一致性 | 不支持事务,靠客户端自身保证 | 支持事物,比较弱,仅能保证事物中的操作按顺序执行 | Redis 优于 MongoDB |
数据分析 | 内置数据分析功能(mapreduce) | 不支持 | MongoDB 优于 Redis |
应用场景 | 海量数据的访问效率提升 | 较小数据量的性能及运算 | MongoDB 优于 Redis |
面试题
- 简述 MongoDB 持久化原理?
- MongoDB 与 MySQL 不同,MySQL 的每一次更新操作都会直接写入硬盘,但是 MongoDB 不会,做为内存型数据库,数据操作会先写入内存,然后再会持久化到硬盘中去,那么 MongoDB 是如何持久化的呢?
- MongoDB 在启动时,专门初始化一个线程不断循环(除非应用 crash 掉),用于在一定时间周期内来从 defer 队列中获取要持久化的数据并写入到磁盘的 journal(日志)和 mongofile(数据)处,当然因为它不是在用户添加记录时就写到磁盘上,所以按 MongoDB 开发者说,它不会造成性能上的损耗,因为看过代码发现,当进行 CUD 操作时,记录(Record 类型)都被放入到 defer 队列中以供延时批量(groupcommit)提交写入,但相信其中时间周期参数是个要认真考量的参数,系统为90毫秒,如果该值更低的话,可能会造成频繁磁盘操作,过高又会造成系统宕机时数据丢失。
- 解释 NoSQL 和 RDBMS ?NoSQL 和 RDBMS 有什么区别?在哪些情况下使用和不使用 NoSQL?
- NoSQL 是非关系型数据库,NoSQL = Not Only SQL;RDBMS 即关系数据库管理系统,Relational Database Management System。
- 非关系型数据库通过存储键值对的方式存储数据,对 ACID 支持较弱或者不支持,严格来说不是一种数据库而是一种数据结构化存储方法的集合;关系型数据库使用关系模型来组织数据,支持 ACID。
- 理论上来说对数据请求较为频繁、开发后期可增强拓展性时、数据重要性一般可使用 NoSQL;对数据关系很复杂、数据量较大且很重要、请求不是那么频繁的时候使用 RDBMS。
- 简述 Redis 和 MongoDB 使用场景?
- Redis
- 取最新 N 个数据的操作
- 排行榜应用, 取 top N 操作
- 需要精准设定过期时间的应用
- 计数器应用
- uniq 操作,获取某段时间所有数据排重值
- pub/sub 构建实时消息系统
- 构建队列系统
- 缓存
- MongoDB
- 网站数据
- 缓存
- 大尺寸,低价值的数据
- 高伸缩性的场景
- 用于对象及 json 数据的存储
- 一般数据存储
- 把 MongoDB当作 MySQL 的一个 view,view 是将表数据整合成业务数据的关键