近来在准备面试,将看到的东西进行下总结。html
redis数据类型丰富,支持set liset等类型
memcache支持简单数据类型,须要客户端本身处理复杂对象java
redis支持数据落地持久化存储
memcache不支持数据持久存储面试
redis支持master-slave复制模式
memcache可使用一致性hash作分布式redis
memcache是一个内存缓存,key的长度小于250字符,单个item存储要小于1M,不适合虚拟机使用算法
redis使用的是单线程模型,保证了数据按顺序提交。
memcache须要使用cas保证数据一致性。CAS(Check and
Set)是一个确保并发一致性的机制,属于“乐观锁”范畴;原理很简单:拿版本号,操做,对比版本号,若是一致就操做,不一致就放弃任何操做spring
redis单线程模型只能使用一个cpu,能够开启多个redis进程mongodb
MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构很是松散,是相似json的bson格式,所以能够存储比较复杂的数据类型。Mongo最大的特色是它支持的查询语言很是强大,其语法有点相似于面向对象的查询语言,几乎能够实现相似关系数据库单表查询的绝大部分功能,并且还支持对数据创建索引。数据库
Redis的存储格式是Key-Value模式,除了基本的string类型,redis还实现了hash,list,set,zset数据类型。json
注解:数组
BSON之名缘于JSON,含义为Binary JSON(二进制JSON),是一种二进制形式的存储格式,采用了相似于 C 语言结构体的名称、对表示方法,支持内嵌的文档对象和数组对象,具备轻量性、可遍历性、高效性的特色,能够有效描述非结构化数据和结构化数据。
与JSON相比,BSON着眼于提升存储和扫描效率。BSON文档中的大型元素以长度字段为前缀以便于扫描。在某些状况下,因为长度前缀和显式数组索引的存在,BSON使用的空间会多于JSON。
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毫秒的数据。
Redis支持事物,比较弱,仅能保证事物中的操做按顺序执行。MongoDB不支持事物,靠客户端自身保证
MongoDb:适合大数据量存储,依赖系统虚拟内存管理,采用镜像文件存储;内存占有率比较高,官方建议独立部署在64位系统(32位有最大2.5G文件限制,64位没有改限制)
Redis2.0后增长虚拟内存特性,突破物理内存限制;数据能够设置时效性,相似于memcache
MongoDB: 支持master-slave,replicaset(内部采用paxos选举算法,自动故障恢复),auto sharding机制,对客户端屏蔽了故障转移和切分机制
Redis: 依赖客户端来实现分布式读写;主从复制时,每次从节点从新链接主节点都要依赖整个快照,无增量复制;不支持自动sharding,须要依赖程序设定一致hash机制
Redis:适用于对读写效率要求都很高,数据处理业务复杂和对安全性要求较高的系统(如新浪微博的计数和微博发布部分系统,对数据安全性、读写要求都很高)。 MongoDB:主要解决海量数据的访问效率问题。