Redis与Memcached比较

若是简单地比较Redis与Memcached的区别,大多数都会获得如下观点:redis

1 Redis不只仅支持简单的k/v类型的数据,同时还提供list,set,hash等数据结构的存储。算法

2 Redis支持数据的备份,即master-slave模式的数据备份。mongodb

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 作了对比,欢迎拍砖app

一、性能分布式

都比较高,性能对咱们来讲应该都不是瓶颈

整体来说,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:主要解决海量数据的访问效率问题

相关文章
相关标签/搜索