Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工做由VMware主持。从2013年5月开始,Redis的开发由Pivotal赞助。javascript
NoSql 数据存储html
memcache是一套分布式的高速缓存系统,由LiveJournal的Brad Fitzpatrick开发,但目前被许多网站使用以提高网站的访问速度,尤为对于一些大型的、须要频繁访问数据库的网站访问速度提高效果十分显著[1] 。这是一套开放源代码软件,以BSD license受权发布。java
分布式的高速缓存系统mysql
1. Redis中,并非全部的数据都一直存储在内存中的,这是和Memcached相比一个最大的区别。
2. Redis不只仅支持简单的k/v类型的数据,同时还提供list,set,hash等数据结构的存储。
3. Redis支持数据的备份,即master-slave模式的数据备份。
4. Redis支持数据的持久化,能够将内存中的数据保持在磁盘中,重启的时候能够再次加载进行使用。redis
Redis在不少方面具有数据库的特征,或者说就是一个数据库系统,而Memcached只是简单的K/V缓存算法
下面是来自redis做者的说法(stackoverflow上面)。
You should not care too much about performances. Redis is faster per core with small values, but memcached is able to use multiple cores with a single executable and TCP port without help from the client. Also memcached is faster with big values in the order of 100k. Redis recently improved a lot about big values (unstable branch) but still memcached is faster in this use case. The point here is: nor one or the other will likely going to be your bottleneck for the query-per-second they can deliver.
You should care about memory usage. For simple key-value pairs memcached is more memory efficient. If you use Redis hashes, Redis is more memory efficient. Depends on the use case.
You should care about persistence and replication, two features only available in Redis. Even if your goal is to build a cache it helps that after an upgrade or a reboot your data are still there.
You should care about the kind of operations you need. In Redis there are a lot of complex operations, even just considering the caching use case, you often can do a lot more in a single operation, without requiring data to be processed client side (a lot of I/O is sometimes needed). This operations are often as fast as plain GET and SET. So if you don’t need just GEt/SET but more complex things Redis can help a lot (think at timeline caching).
有网友翻译以下[1]:
没有必要过多的关注性能。因为Redis只使用单核,而Memcached可使用多核,因此在比较上,平均每个核上Redis在存储小数据时比Memcached性能更高。而在100k以上的数据中,Memcached性能要高于Redis,虽然Redis最近也在存储大数据的性能上进行优化,可是比起Memcached,仍是稍有逊色。说了这么多,结论是,不管你使用哪个,每秒处理请求的次数都不会成为瓶颈。
你须要关注内存使用率。对于key-value这样简单的数据储存,memcache的内存使用率更高。若是采用hash结构,redis的内存使用率会更高。固然,这些都依赖于具体的应用场景。
你须要关注关注数据持久化和主从复制时,只有redis拥有这两个特性。若是你的目标是构建一个缓存在升级或者重启后以前的数据不会丢失的话,那也只能选择redis。
你应该关心你须要的操做。redis支持不少复杂的操做,甚至只考虑内存的使用状况,在一个单一操做里你经常能够作不少,而不须要将数据读取到客户端中(这样会须要不少的IO操做)。这些复杂的操做基本上和纯GET和POST操做同样快,因此你不仅是须要GET/SET而是更多的操做时,redis会起很大的做用。
对于二者的选择仍是要看具体的应用场景,若是须要缓存的数据只是key-value这样简单的结构时,我在项目里仍是采用memcache,它也足够的稳定可靠。若是涉及到存储,排序等一系列复杂的操做时,毫无疑问选择redis。sql
其余:
一、 Redis和Memcache都是将数据存放在内存中,都是内存数据库。不过memcache还可用于缓存其余东西,例如图片、视频等等。
二、Redis不只仅支持简单的k/v类型的数据,同时还提供list,set,hash等数据结构的存储。
三、虚拟内存–Redis当物理内存用完时,能够将一些好久没用到的value 交换到磁盘
四、过时策略–memcache在set时就指定,例如set key1 0 0 8,即永不过时。Redis能够经过例如expire 设定,例如expire name 10
五、分布式–设定memcache集群,利用magent作一主多从;redis能够作一主多从。均可以一主一从
六、存储数据安全–memcache挂掉后,数据没了;redis能够按期保存到磁盘(持久化)
七、灾难恢复–memcache挂掉后,数据不可恢复; redis数据丢失后能够经过aof恢复
八、Redis支持数据的备份,即master-slave模式的数据备份。mongodb
关于redis和memcache的不一样,下面罗列了一些相关说法,供记录:数据库
redis和memecache的不一样在于[2]:
一、存储方式:
memecache 把数据所有存在内存之中,断电后会挂掉,数据不能超过内存大小
redis有部份存在硬盘上,这样能保证数据的持久性,支持数据的持久化(笔者注:有快照和AOF日志两种持久化方式,在实际应用的时候,要特别注意配置文件快照参数,要不就颇有可能服务器频繁满载作dump)。
二、数据支持类型:
redis在数据支持上要比memecache多的多。
三、使用底层模型不一样:
新版本的redis直接本身构建了VM 机制 ,由于通常的系统调用系统函数的话,会浪费必定的时间去移动和请求。
四、运行环境不一样:
redis目前官方只支持LINUX 上去行,从而省去了对于其它系统的支持,这样的话能够更好的把精力用于本系统 环境上的优化,虽而后来微软有一个小组为其写了补丁。可是没有放到主干上json
我的总结一下,有持久化需求或者对数据结构和处理有高级要求的应用,选择redis,其余简单的key/value存储,选择memcache。
下面重点分析Memcached和Redis两种方案:
Memcached介绍
Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它经过在内存中缓存数据和对象来减小读取数据库的次数,从而提供动态、数据库驱动网站的速度,如今已被LiveJournal、hatena、Facebook、Vox、LiveJournal等公司所使用。
Memcached工做方式分析
许多Web应用都将数据保存到 RDBMS中,应用服务器从中读取数据并在浏览器中显示。 但随着数据量的增大、访问的集中,就会出现RDBMS的负担加剧、数据库响应恶化、 网站显示延迟等重大影响。Memcached是高性能的分布式内存缓存服务器,经过缓存数据库查询结果,减小数据库访问次数,以提升动态Web等应用的速度、 提升可扩展性。下图展现了memcache与数据库端协同工做状况:
其中的过程是这样的:
1.检查用户请求的数据是缓存中是否有存在,若是有存在的话,只须要直接把请求的数据返回,无需查询数据库。
2.若是请求的数据在缓存中找不到,这时候再去查询数据库。返回请求数据的同时,把数据存储到缓存中一份。
3.保持缓存的“新鲜性”,每当数据发生变化的时候(好比,数据有被修改,或被删除的状况下),要同步的更新缓存信息,确保用户不会在缓存取到旧的数据。
Memcached做为高速运行的分布式缓存服务器,具备如下的特色:
1.协议简单
2.基于libevent的事件处理
3.内置内存存储方式
4.memcached不互相通讯的分布式
如何实现分布式可拓展性?
Memcached的分布式不是在服务器端实现的,而是在客户端应用中实现的,即经过内置算法制定目标数据的节点,以下图所示:
Redis 介绍
Redis是一个key-value存储系统。和Memcached相似,它支持存储的value类型相对更多,包括string(字符串)、 list(链表)、set(集合)和zset(有序集合)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操做,并且这些操做都是原子性的。在此基础上,redis支持各类不一样方式的排序。与memcached同样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操做写入追加的记录文件,而且在此基础上实现了master-slave(主从)同步,当前 Redis的应用已经很是普遍,国内像新浪、淘宝,国外像 Flickr、Github等均在使用Redis的缓存服务。
Redis 工做方式分析
Redis做为一个高性能的key-value数据库具备如下特征:
1.多样的数据模型
2.持久化
3.主从同步
Redis支持丰富的数据类型,最为经常使用的数据类型主要由五种:String、Hash、List、Set和Sorted Set。Redis一般将数据存储于内存中,或被配置为使用虚拟内存。Redis有一个很重要的特色就是它能够实现持久化数据,经过两种方式能够实现数据持久化:使用RDB快照的方式,将内存中的数据不断写入磁盘;或使用相似MySQL的AOF日志方式,记录每次更新的日志。前者性能较高,可是可能会引发必定程度的数据丢失;后者相反。 Redis支持将数据同步到多台从数据库上,这种特性对提升读取性能很是有益。
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。
综合结论
应该说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:适用于对读写效率要求都很高,数据处理业务复杂和对安全性要求较高的系统(如新浪微博的计数和微博发布部分系统,对数据安全性、读写要求都很高)。
须要慎重考虑的部分
1.Memcached单个key-value大小有限,一个value最大只支持1MB,而Redis最大支持512MB
2.Memcached只是个内存缓存,对可靠性无要求;而Redis更倾向于内存数据库,所以对对可靠性方面要求比较高
3.从本质上讲,Memcached只是一个单一key-value内存Cache;而Redis则是一个数据结构内存数据库,支持五种数据类型,所以Redis除单纯缓存做用外,还能够处理一些简单的逻辑运算,Redis不只能够缓存,并且还能够做为数据库用
4.新版本(3.0)的Redis是指集群分布式,也就是说集群自己均衡客户端请求,各个节点能够交流,可拓展行、可维护性更强大。
ref:
http://blog.163.com/sun_jian_zhang/blog/static/187804041201310795917333/?suggestedreading&wumii
http://www.cnblogs.com/EE-NovRain/p/3268476.html
http://www.open-open.com/lib/view/open1409643182369.html
Memcached的优势:
Memcached能够利用多核优点,单实例吞吐量极高,能够达到几十万QPS(取决于key、value的字节大小以及服务器硬件性能,平常环境中QPS高峰大约在4-6w左右)。适用于最大程度扛量。
支持直接配置为session handle。
Memcached的局限性:
只支持简单的key/value数据结构,不像Redis能够支持丰富的数据类型。
没法进行持久化,数据不能备份,只能用于缓存使用,且重启后数据所有丢失。
没法进行数据同步,不能将MC中的数据迁移到其余MC实例中。
Memcached内存分配采用Slab Allocation机制管理内存,value大小分布差别较大时会形成内存利用率下降,并引起低利用率时依然出现踢出等问题。须要用户注重value设计。
Redis的优势:
支持多种数据结构,如 string(字符串)、 list(双向链表)、dict(hash表)、set(集合)、zset(排序set)、hyperloglog(基数估算)
支持持久化操做,能够进行aof及rdb数据持久化到磁盘,从而进行数据备份或数据恢复等操做,较好的防止数据丢失的手段。
支持经过Replication进行数据复制,经过master-slave机制,能够实时进行数据的同步复制,支持多级复制和增量复制,master-slave机制是Redis进行HA的重要手段。
单线程请求,全部命令串行执行,并发状况下不须要考虑数据一致性问题。
支持pub/sub消息订阅机制,能够用来进行消息订阅与通知。
支持简单的事务需求,但业界使用场景不多,并不成熟。
Redis的局限性:
Redis只能使用单线程,性能受限于CPU性能,故单实例CPU最高才可能达到5-6wQPS每秒(取决于数据结构,数据大小以及服务器硬件性能,平常环境中QPS高峰大约在1-2w左右)。
支持简单的事务需求,但业界使用场景不多,并不成熟,既是优势也是缺点。
Redis在string类型上会消耗较多内存,可使用dict(hash表)压缩存储以下降内存耗用。
Mc和Redis都是Key-Value类型,不适合在不一样数据集之间创建关系,也不适合进行查询搜索。好比redis的keys pattern这种匹配操做,对redis的性能是灾难。
mongoDB 是一种文档性的数据库。先解释一下文档的数据库,便可以存放xml、json、bson类型系那个的数据。
这些数据具有自述性(self-describing),呈现分层的树状数据结构。redis能够用hash存放简单关系型数据。
mongoDB 存放json格式数据。
适合场景:事件记录、内容管理或者博客平台,好比评论系统。
1.mongodb持久化原理
mongodb与mysql不一样,mysql的每一次更新操做都会直接写入硬盘,可是mongo不会,作为内存型数据库,数据操做会先写入内存,而后再会持久化到硬盘中去,那么mongo是如何持久化的呢
mongodb在启动时,专门初始化一个线程不断循环(除非应用crash掉),用于在必定时间周期内来从defer队列中获取要持久化的数据并写入到磁盘的journal(日志)和mongofile(数据)处,固然由于它不是在用户添加记录时就写到磁盘上,因此按mongodb开发者说,它不会形成性能上的损耗,由于看过代码发现,当进行CUD操做时,记录(Record类型)都被放入到defer队列中以供延时批量(groupcommit)提交写入,但相信其中时间周期参数是个要认真考量的参数,系统为90毫秒,若是该值更低的话,可能会形成频繁磁盘操做,太高又会形成系统宕机时数据丢失过。
2.什么是NoSQL数据库?NoSQL和RDBMS有什么区别?在哪些状况下使用和不使用NoSQL数据库?
NoSQL是非关系型数据库,NoSQL = Not Only SQL。
关系型数据库采用的结构化的数据,NoSQL采用的是键值对的方式存储数据。
在处理非结构化/半结构化的大数据时;在水平方向上进行扩展时;随时应对动态增长的数据项时能够优先考虑使用NoSQL数据库。
在考虑数据库的成熟度;支持;分析和商业智能;管理及专业性等问题时,应优先考虑关系型数据库。
3.MySQL和MongoDB之间最基本的区别是什么?
关系型数据库与非关系型数据库的区别,即数据存储结构的不一样。
4.MongoDB的特色是什么?
(1)面向文档(2)高性能(3)高可用(4)易扩展(5)丰富的查询语言
5.MongoDB支持存储过程吗?若是支持的话,怎么用?
MongoDB支持存储过程,它是javascript写的,保存在db.system.js表中。
6.如何理解MongoDB中的GridFS机制,MongoDB为什么使用GridFS来存储文件?
GridFS是一种将大型文件存储在MongoDB中的文件规范。使用GridFS能够将大文件分隔成多个小文档存放,这样咱们可以有效的保存大文档,并且解决了BSON对象有限制的问题。
7.为何MongoDB的数据文件很大?
MongoDB采用的预分配空间的方式来防止文件碎片。
8.当更新一个正在被迁移的块(Chunk)上的文档时会发生什么?
更新操做会当即发生在旧的块(Chunk)上,而后更改才会在全部权转移前复制到新的分片上。
9.MongoDB在A:{B,C}上创建索引,查询A:{B,C}和A:{C,B}都会使用索引吗?
不会,只会在A:{B,C}上使用索引。
10.若是一个分片(Shard)中止或很慢的时候,发起一个查询会怎样?
若是一个分片中止了,除非查询设置了“Partial”选项,不然查询会返回一个错误。若是一个分片响应很慢,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:主要解决海量数据的访问效率问题