Redis与MongDB、memcache与的区别

 阅读约 6 分钟

近来在准备面试,将看到的东西进行下总结。

一、Redis和memcache的区别

  • 1、数据类型

redis数据类型丰富,支持set liset等类型
memcache支持简单数据类型,需要客户端自己处理复杂对象

  • 2、持久性

redis支持数据落地持久化存储
memcache不支持数据持久存储

  • 3、分布式存储

redis支持master-slave复制模式
memcache可以使用一致性hash做分布式

  • 4、value大小不同

memcache是一个内存缓存,key的长度小于250字符,单个item存储要小于1M,不适合虚拟机使用

  • 5、数据一致性不同

redis使用的是单线程模型,保证了数据按顺序提交。
memcache需要使用cas保证数据一致性。CAS(Check and
Set)是一个确保并发一致性的机制,属于“乐观锁”范畴;原理很简单:拿版本号,操作,对比版本号,如果一致就操作,不一致就放弃任何操作

  • 6、cpu利用

redis单线程模型只能使用一个cpu,可以开启多个redis进程

二、Redis和MongoDB的区别

  • 1、 数据存储

MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

Redis的存储格式是Key-Value模式,除了基本的string类型,redis还实现了hash,list,set,zset数据类型。

注解:

BSON之名缘于JSON,含义为Binary JSON(二进制JSON),是一种二进制形式的存储格式,采用了类似于 C 语言结构体的名称、对表示方法,支持内嵌的文档对象和数组对象,具有轻量性、可遍历性、高效性的特点,可以有效描述非结构化数据和结构化数据。

与JSON相比,BSON着眼于提高存储和扫描效率。BSON文档中的大型元素以长度字段为前缀以便于扫描。在某些情况下,由于长度前缀和显式数组索引的存在,BSON使用的空间会多于JSON。

  • 2、数据持久化

Redis本身支持两种持久化,RDB(快照)和AOF追加方式。RDB持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘,实际操作过程是fork一个子进程,先将数据集写入临时文件,写入成功后,再替换之前的文件,用二进制压缩存储。AOF持久化以日志的形式记录服务器所处理的每一个写、删除操作,查询操作不会记录,以文本的方式记录,可以打开文件看到详细的操作记录。

mongodb在启动时,专门初始化一个线程不断循环(除非应用crash掉),用于在一定时间周期内来从defer队列中获取要持久化的数据并写入到磁盘的journal(日志)和mongofile(数据)处,当然因为它不是在用户添加记录时就写到磁盘上,所以按mongodb开发者说,它不会造成性能上的损耗,因为看过代码发现,当进行CUD操作时,记录(Record类型)都被放入到defer队列中以供延时批量(groupcommit)提交写入。
mongodb在写入时会建立一条日志(journal),日志中记载了此次写入操作具体更改的磁盘地址和字节。因此,一旦服务器突然停电,可以在启动时对日志进行重放,从而重新执行那些停机前没有刷新到磁盘的操作。数据文件默认每60s刷盘一次。数据文件存放到/data/db/journal目录里。
mongodb默认每隔100毫秒或者写入数据达到若干兆字节后,便会将这些操作写入到日志。即mongodb不会在每次写入的时候都写入到日志,而是会成批量的提交更改。因此,在默认设置情况下,mongodb不会丢失超过100毫秒的数据。

  • 3、一致性

Redis支持事物,比较弱,仅能保证事物中的操作按顺序执行。MongoDB不支持事物,靠客户端自身保证

  • 4、内存及存储

MongoDb:适合大数据量存储,依赖系统虚拟内存管理,采用镜像文件存储;内存占有率比较高,官方建议独立部署在64位系统(32位有最大2.5G文件限制,64位没有改限制)

Redis2.0后增加虚拟内存特性,突破物理内存限制;数据可以设置时效性,类似于memcache

  • 5、可用性

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

Redis: 依赖客户端来实现分布式读写;主从复制时,每次从节点重新连接主节点都要依赖整个快照,无增量复制;不支持自动sharding,需要依赖程序设定一致hash机制

  • 6、应用场景

Redis:适用于对读写效率要求都很高,数据处理业务复杂和对安全性要求较高的系统(如新浪微博的计数和微博发布部分系统,对数据安全性、读写要求都很高)。   MongoDB:主要解决海量数据的访问效率问题。

参考:

阅读 345发布于 8月15日
推荐阅读
目录