Memcache,Redis,MongoDB(数据缓存系统)方案对比与分析

mongodb和memcached不是一个范畴内的东西。mongodb是文档型的非关系型数据库,其优点在于查询功能比较强大,能存储海量数据。mongodb和memcached不存在谁替换谁的问题。

和memcached更为接近的是redis。它们都是内存型数据库,数据保存在内存中,经过tcp直接存取,优点是速度快,并发高,缺点是数据类型有限,查询功能不强,通常用做缓存。在咱们团队的项目中,一开始用的是memcached,后来用redis替代。

相比memcached:

一、redis具备持久化机制,能够按期将内存中的数据持久化到硬盘上。

二、redis具有binlog功能,能够将全部操做写入日志,当redis出现故障,可依照binlog进行数据恢复。

三、redis支持virtual memory,能够限定内存使用大小,当数据超过阈值,则经过相似LRU的算法把内存中的最不经常使用数据保存到硬盘的页面文件中。

四、redis原生支持的数据类型更多,使用的想象空间更大。

五、前面有位朋友所说起的一致性哈希,用在redis的sharding中,通常是在负载很是高须要水平扩展时使用。咱们尚未用到这方面的功能,通常的项目,单机足够支撑并发了。redis 3.0将推出cluster,功能更增强大。git

 

Eg:github

1、问题:
     
    数据库表数据量极大(千万条),要求让服务器更加快速地响应用户的需求。
 
2、解决方案:
     1.经过高速服务器Cache缓存数据库数据
     2.内存数据库
 
  (这里仅从数据缓存方面考虑,固然,后期能够采用Hadoop+HBase+Hive等分布式存储分析平台)
3、主流解Cache和数据库对比:
d1.png
 
     上述技术基本上表明了当今在数据存储方面全部的实现方案,其中主要涉及到了普通关系型数据库(MySQL/PostgreSQL),NoSQL数据库(MongoDB),内存数据库(Redis),内存Cache(Memcached),咱们如今须要的是对大数据表仍保持高效的查询速度,普通关系型数据库是没法知足的。而MongoDB其实只是一种非关系型数据库,其优点在于能够存储海量数据,具有强大的查询功能,所以不宜用于缓存数据的场景。
 
       从以上各数据可知,对于咱们产品最可行的技术方案有两种:
         1.Memcached         内存Key-Value Cache
         2.Redis                     内存数据库
 
4、下面重点分析Memcached和Redis两种方案:
 
4.1 Memcached介绍  
 
     Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它经过在内存中缓存数据和对象来减小读取数据库的次数,从而提供动态、数据库驱动网站的速度,如今已被LiveJournal、hatena、Facebook、Vox、LiveJournal等公司所使用。
 
4.2 Memcached工做方式分析
     
     许多Web应用都将数据保存到 RDBMS中,应用服务器从中读取数据并在浏览器中显示。 但随着数据量的增大、访问的集中,就会出现RDBMS的负担加剧、数据库响应恶化、 网站显示延迟等重大影响。Memcached是高性能的分布式内存缓存服务器,经过缓存数据库查询结果,减小数据库访问次数,以提升动态Web等应用的速度、 提升可扩展性。下图展现了memcache与数据库端协同工做状况:
 
      d2.png
     其中的过程是这样的:
           1.检查用户请求的数据是缓存中是否有存在,若是有存在的话,只须要直接把请求的数据返回,无需查询数据库。

           2.若是请求的数据在缓存中找不到,这时候再去查询数据库。返回请求数据的同时,把数据存储到缓存中一份。
           3.保持缓存的“新鲜性”,每当数据发生变化的时候(好比,数据有被修改,或被删除的状况下),要同步的更新缓存信息,确保用户不会在缓存取到旧的数据。redis


     Memcached做为高速运行的分布式缓存服务器,具备如下的特色: 
    • 协议简单 
    • 基于libevent的事件处理 
    • 内置内存存储方式
    • memcached不互相通讯的分布式
 
4.3 如何实现分布式可拓展性?

     Memcached的分布式不是在服务器端实现的,而是在客户端应用中实现的,即经过内置算法制定目标数据的节点,以下图所示:
d3.png
4.4 Redis 介绍  
 
     Redis是一个key-value存储系统。和Memcached相似,它支持存储的value类型相对更多,包括string(字符串)、 list(链表)、set(集合)和zset(有序集合)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操做,并且这些操做都是原子性的。在此基础上,redis支持各类不一样方式的排序。与memcached同样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操做写入追加的记录文件,而且在此基础上实现了master-slave(主从)同步,当前 Redis的应用已经很是普遍,国内像新浪、淘宝,国外像 Flickr、Github等均在使用Redis的缓存服务。
 
4.5 Redis 工做方式分析
 
     Redis做为一个高性能的key-value数据库具备如下特征: 
    • 多样的数据模型 
    • 持久化 
    • 主从同步  
     Redis支持丰富的数据类型,最为经常使用的数据类型主要由五种:String、Hash、List、Set和Sorted Set。Redis一般将数据存储于内存中,或被配置为使用虚拟内存。Redis有一个很重要的特色就是它能够实现持久化数据,经过两种方式能够实现数据持久化:使用RDB快照的方式,将内存中的数据不断写入磁盘;或使用相似MySQL的AOF日志方式,记录每次更新的日志。前者性能较高,可是可能会引发必定程度的数据丢失;后者相反。 Redis支持将数据同步到多台从数据库上,这种特性对提升读取性能很是有益。
     

4.6 Redis如何实现分布式可拓展性?
 
2.8之前的版本:与Memcached一致,能够在客户端实现,也可使用代理,twitter已开发出用于Redis和Memcached的代理 Twemproxy 。
3.0 之后的版本:相较于Memcached只能采用客户端实现分布式存储,Redis则在服务器端构建分布式存储。Redis Cluster是一个实现了分布式且容许单点故障的Redis高级版本,它没有中心节点,各个节点地位一致,具备线性可伸缩的功能。如图给出Redis Cluster的分布式存储架构,其中节点与节点之间经过二进制协议进行通讯,节点与客户端之间经过ascii协议进行通讯。在数据的放置策略上,Redis Cluster将整个 key的数值域分红16384个哈希槽,每一个节点上能够存储一个或多个哈希槽,也就是说当前Redis Cluster支持的最大节点数就是16384
 
      d4.jpg
 
5、综合结论
 
   
 应该说Memcached和Redis都能很好的知足解决咱们的问题,它们性能都很高,总的来讲,能够把Redis理解为是对Memcached的拓展,是更加剧量级的实现,提供了更多更强大的功能。具体来讲:
 
1.性能上:
     性能上都很出色,具体到细节,因为Redis只使用单核,而Memcached可使用多核,因此平均每个核上Redis在存储小数据时比
Memcached性能更高。而在100k以上的数据中,Memcached性能要高于Redis,虽然Redis最近也在存储大数据的性能上进行优化,可是比起 Memcached,仍是稍有逊色。
 
2.内存空间和数据量大小:
     MemCached能够修改最大内存,采用LRU算法。Redis增长了VM的特性,突破了物理内存的限制。
 
3.操做便利上:
     MemCached数据结构单一,仅用来缓存数据,而Redis支持更加丰富的数据类型,也能够在服务器端直接对数据进行丰富的操做,这样能够减小网络IO次数和数据体积。
 
4.可靠性上:
     MemCached不支持数据持久化,断电或重启后数据消失,但其稳定性是有保证的。Redis支持数据持久化和数据恢复,容许单点故障,可是同时也会付出性能的代价。
 
5.应用场景:
     Memcached:动态系统中减轻数据库负载,提高性能;作缓存,适合多读少写,大数据量的状况(如人人网大量查询用户信息、好友信息、文章信息等)。
     Redis:适用于对读写效率要求都很高,数据处理业务复杂和对安全性要求较高的系统(如新浪微博的计数和微博发布部分系统,对数据安全性、读写要求都很高)。
 
6、须要慎重考虑的部分
 
1.Memcached单个key-value大小有限,一个value最大只支持1MB,而Redis最大支持512MB
2.Memcached只是个内存缓存,对可靠性无要求;而Redis更倾向于内存数据库,所以对对可靠性方面要求比较高
3.从本质上讲,Memcached只是一个单一key-value内存Cache;而Redis则是一个数据结构内存数据库,支持五种数据类型,所以Redis除单纯缓存做用外,还能够处理一些简单的逻辑运算,Redis不只能够缓存,并且还能够做为数据库用
4.新版本(3.0)的Redis是指集群分布式,也就是说集群自己均衡客户端请求,各个节点能够交流,可拓展行、可维护性更强大。
相关文章
相关标签/搜索