Redis 与 MongoDB

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 系统不受限制
  • 维护工具不太成熟

性能指标对比

指标MongoDBRedis比较
实现语言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

面试题

  1. 简述 MongoDB 持久化原理?
  • MongoDB 与 MySQL 不同,MySQL 的每一次更新操作都会直接写入硬盘,但是 MongoDB 不会,做为内存型数据库,数据操作会先写入内存,然后再会持久化到硬盘中去,那么 MongoDB 是如何持久化的呢?
  • MongoDB 在启动时,专门初始化一个线程不断循环(除非应用 crash 掉),用于在一定时间周期内来从 defer 队列中获取要持久化的数据并写入到磁盘的 journal(日志)和 mongofile(数据)处,当然因为它不是在用户添加记录时就写到磁盘上,所以按 MongoDB 开发者说,它不会造成性能上的损耗,因为看过代码发现,当进行 CUD 操作时,记录(Record 类型)都被放入到 defer 队列中以供延时批量(groupcommit)提交写入,但相信其中时间周期参数是个要认真考量的参数,系统为90毫秒,如果该值更低的话,可能会造成频繁磁盘操作,过高又会造成系统宕机时数据丢失。
  1. 解释 NoSQL 和 RDBMS ?NoSQL 和 RDBMS 有什么区别?在哪些情况下使用和不使用 NoSQL?
  • NoSQL 是非关系型数据库,NoSQL = Not Only SQL;RDBMS 即关系数据库管理系统,Relational Database Management System。
  • 非关系型数据库通过存储键值对的方式存储数据,对 ACID 支持较弱或者不支持,严格来说不是一种数据库而是一种数据结构化存储方法的集合;关系型数据库使用关系模型来组织数据,支持 ACID。
  • 理论上来说对数据请求较为频繁、开发后期可增强拓展性时、数据重要性一般可使用 NoSQL;对数据关系很复杂、数据量较大且很重要、请求不是那么频繁的时候使用 RDBMS。
  1. 简述 Redis 和 MongoDB 使用场景?
  • Redis
    • 取最新 N 个数据的操作
    • 排行榜应用, 取 top N 操作
    • 需要精准设定过期时间的应用
    • 计数器应用
    • uniq 操作,获取某段时间所有数据排重值
    • pub/sub 构建实时消息系统
    • 构建队列系统
    • 缓存
  • MongoDB
    • 网站数据
    • 缓存
    • 大尺寸,低价值的数据
    • 高伸缩性的场景
    • 用于对象及 json 数据的存储
    • 一般数据存储
    • 把 MongoDB当作 MySQL 的一个 view,view 是将表数据整合成业务数据的关键
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值