观点一:html
一、Redis和Memcache都是将数据存放在内存中,都是内存数据库。不过memcache还可用于缓存其余东西,例如图片、视频等等;redis
二、Redis不只仅支持简单的k/v类型的数据,同时还提供list,set,hash等数据结构的存储;算法
三、虚拟内存--Redis当物理内存用完时,能够将一些好久没用到的value 交换到磁盘;mongodb
四、过时策略--memcache在set时就指定,例如set key1 0 0 8,即永不过时。Redis能够经过例如expire 设定,例如expire name 10;数据库
五、分布式--设定memcache集群,利用magent作一主多从;redis能够作一主多从。均可以一主一从;缓存
六、存储数据安全--memcache挂掉后,数据没了;redis能够按期保存到磁盘(持久化);安全
七、灾难恢复--memcache挂掉后,数据不可恢复; redis数据丢失后能够经过aof恢复;网络
八、Redis支持数据的备份,即master-slave模式的数据备份;数据结构
观点二:并发
若是简单地比较Redis与Memcached的区别,大多数都会获得如下观点:
1 Redis不只仅支持简单的k/v类型的数据,同时还提供list,set,hash等数据结构的存储。
2 Redis支持数据的备份,即master-slave模式的数据备份。
3 Redis支持数据的持久化,能够将内存中的数据保持在磁盘中,重启的时候能够再次加载进行使用。
在Redis中,并非全部的数据都一直存储在内存中的。这是和Memcached相比一个最大的区别(我我的是这么认为的)。
Redis 只会缓存全部的key的信息,若是Redis发现内存的使用量超过了某一个阀值,将触发swap的操做,Redis根据“swappability = age*log(size_in_memory)”计算出哪些key对应的value须要swap到磁盘。而后再将这些key对应的value持久化到磁 盘中,同时在内存中清除。这种特性使得Redis能够保持超过其机器自己内存大小的数据。固然,机器自己的内存必需要可以保持全部的key,毕竟这些数据 是不会进行swap操做的。
同时因为Redis将内存中的数据swap到磁盘中的时候,提供服务的主线程和进行swap操做的子线程会共享这部份内存,因此若是更新须要swap的数据,Redis将阻塞这个操做,直到子线程完成swap操做后才能够进行修改。
能够参考使用Redis特有内存模型先后的状况对比:
VM off: 300k keys, 4096 bytes values: 1.3G used
VM on: 300k keys, 4096 bytes values: 73M used
VM off: 1 million keys, 256 bytes values: 430.12M used
VM on: 1 million keys, 256 bytes values: 160.09M used
VM on: 1 million keys, values as large as you want, still: 160.09M used
当 从Redis中读取数据的时候,若是读取的key对应的value不在内存中,那么Redis就须要从swap文件中加载相应数据,而后再返回给请求方。 这里就存在一个I/O线程池的问题。在默认的状况下,Redis会出现阻塞,即完成全部的swap文件加载后才会相应。这种策略在客户端的数量较小,进行 批量操做的时候比较合适。可是若是将Redis应用在一个大型的网站应用程序中,这显然是没法知足大并发的状况的。因此Redis运行咱们设置I/O线程 池的大小,对须要从swap文件中加载相应数据的读取请求进行并发操做,减小阻塞的时间。 redis、memcache、mongoDB 对比 从如下几个维度,对redis、memcache、mongoDB 作了对比,欢迎拍砖 一、性能 都比较高,性能对咱们来讲应该都不是瓶颈 整体来说,TPS方面redis和memcache差很少,要大于mongodb 二、操做的便利性 memcache数据结构单一 redis丰富一些,数据操做方面,redis更好一些,较少的网络IO次数 mongodb支持丰富的数据表达,索引,最相似关系型数据库,支持的查询语言很是丰富 三、内存空间的大小和数据量的大小 redis在2.0版本后增长了本身的VM特性,突破物理内存的限制;能够对key value设置过时时间(相似memcache) memcache能够修改最大可用内存,采用LRU算法 mongoDB适合大数据量的存储,依赖操做系统VM作内存管理,吃内存也比较厉害,服务不要和别的服务在一块儿 四、可用性(单点问题) 对于单点问题, redis,依赖客户端来实现分布式读写;主从复制时,每次从节点从新链接主节点都要依赖整个快照,无增量复制,因性能和效率问题, 因此单点问题比较复杂;不支持自动sharding,须要依赖程序设定一致hash 机制。 一种替代方案是,不用redis自己的复制机制,采用本身作主动复制(多份存储),或者改为增量复制的方式(须要本身实现),一致性问题和性能的权衡 Memcache自己没有数据冗余机制,也不必;对于故障预防,采用依赖成熟的hash或者环状的算法,解决单点故障引发的抖动问题。 mongoDB支持master-slave,replicaset(内部采用paxos选举算法,自动故障恢复),auto sharding机制,对客户端屏蔽了故障转移和切分机制。 五、可靠性(持久化) 对于数据持久化和数据恢复, redis支持(快照、AOF):依赖快照进行持久化,aof加强了可靠性的同时,对性能有所影响 memcache不支持,一般用在作缓存,提高性能; MongoDB从1.8版本开始采用binlog方式支持持久化的可靠性 六、数据一致性(事务支持) Memcache 在并发场景下,用cas保证一致性 redis事务支持比较弱,只能保证事务中的每一个操做连续执行 mongoDB不支持事务 七、数据分析 mongoDB内置了数据分析的功能(mapreduce),其余不支持 八、应用场景 redis:数据量较小的更性能操做和运算上 memcache:用于在动态系统中减小数据库负载,提高性能;作缓存,提升性能(适合读多写少,对于数据量比较大,能够采用sharding) MongoDB:主要解决海量数据的访问效率问题