redis和memcached及MongoDB的区别

  • 性能
  • 内存空间和数据量大小
  • 操作便利
  • 可靠性(持久化)
  • 分布式(单点问题)
  • 应用场景



性能

性能上都很出色,具体到细节,由于Redis只使用单核,而Memcached可以使用多核,所以平均每一个核上Redis在存储小数据时比Memcached性能更高。而在100k以上的数据中,Memcached性能要高于Redis,虽然Redis最近也在存储大数据的性能上进行优化,但是比起 Memcached,还是稍有逊色。
总体来讲,TPS方面redis和memcache差不多,要大于mongodb

内存空间和数据量大小

memcache可以修改最大可用内存,采用LRU算法
redis在2.0版本后增加了自己的VM特性,突破物理内存的限制;可以对key value设置过期时间(类似memcache);Redis当物理内存用完时,可以将一些很久没用到的value 交换到磁盘
mongoDB适合大数据量的存储,依赖操作系统VM做内存管理,吃内存也比较厉害,服务不要和别的服务在一起

操作便利

memcache数据结构单一,仅用来缓存数据
redis支持的数据类型丰富一些;数据操作方面,redis更好一些,可以在服务器端直接对数据进行丰富的操作,这样可以减少网络IO次数和数据体积
mongodb支持丰富的数据表达,索引,最类似关系型数据库,支持的查询语言非常丰富

可靠性(持久化)

MemCached不支持数据持久化,通常用在做缓存而提升性能,断电或重启后数据消失,但其稳定性是有保证的。
Redis支持数据持久化(快照、AOF)和数据恢复,允许单点故障,但是同时也会付出性能的代价。
MongoDB从1.8版本开始采用binlog方式支持持久化的可靠性。

分布式(单点问题)

Memcache本身没有数据冗余机制,事实上没必要;如果要做,由于memcached没有内置分布式功能,需要做HA,通过Magent缓存代理,防止单点隐患。
Memcached的分布式不是在服务器端实现的,而是在客户端应用中实现的,即通过内置算法制定目标数据的节点。
Redis支持数据持久化(快照、AOF)和数据恢复,允许单点故障,但是同时也会付出性能的代价。2.8以前的版本:与Memcached一致,可以在客户端实现,也可以使用代理,twitter已开发出用于Redis和Memcached的代理Twemproxy 。3.0 以后的版本:相较于Memcached只能采用客户端实现分布式存储,Redis则在服务器端构建分布式存储。Redis Cluster是一个实现了分布式且允许单点故障的Redis高级版本,它没有中心节点,各个节点地位一致,具有线性可伸缩的功能。如图给出Redis Cluster的分布式存储架构,其中节点与节点之间通过二进制协议进行通信,节点与客户端之间通过ascii协议进行通信。在数据的放置策略上,Redis Cluster将整个 key的数值域分成16384个哈希槽,每个节点上可以存储一个或多个哈希槽,也就是说当前Redis Cluster支持的最大节点数就是16384。
mongoDB支持master-slave,replicaset(内部采用paxos选举算法,自动故障恢复),auto sharding机制,对客户端屏蔽了故障转移和切分机制。

应用场景

memcache:动态系统中减轻数据库负载,提升性能;做缓存,适合多读少写,大数据量的情况(如人人网大量查询用户信息、好友信息、文章信息等)
redis:适用于对读写效率要求都很高,数据处理业务复杂和对安全性要求较高的系统(如新浪微博的计数和微博发布部分系统,对数据安全性、读写要求都很高)
mongodb:主要解决海量数据的访问效率问题。