MongoDB、ElasitcSearch、Redis、HBase是现今最火的四款NoSQL数据库产品。在实际的开发中,这四种数据库有什么区别?我到底该选哪一个?想必这是不少互联网开发都遇到过的难题。下面就给你们总结下这四种数据库产品的特色和应用场景,但愿可以帮助你更深入的理解这四种数据库的特色,好帮助你做出正确的数据库选择。程序员
MongoDB是当今最火爆的NoSQL数据库。MongoDB最先在09年发布,算得上是早期大数据时代的数据库表明做了。随着MongoDB的火爆,研发MongoDB的团队还专门成立了MongoDB公司来对MongoDB进行维护和推广,如今这个公司已经在纳斯达克上市,市值达到十几亿美圆,算得上是技术变现的典范了。redis
MongoDB最大的特色是表结构灵活可变,字段类型能够随时修改。MongoDB中的每一行数据只是简单的被转化成Json格式后存储,所以MongoDB中压根没有MySQL中表结构这样的概念,你能够直接简单粗暴的将任意结构的数据塞入同一个表中,压根没必要考虑表结构的限制,更没必要像MySQL同样由于要修改数据表结构而大费周折。简而言之,往MySQL写数据像是在作填空题,你写入的数据必须与最先定义的表结构一致,而往MongoDB写数据就像是在作问答题,想怎么写就怎么写,这灵活度不要爽太多。数据库
说完MongoDB的优势也该说一说它的缺点了。MongoDB不须要定义表结构这个特色给表结构的修改带来了极大的方便,可是也给多表查询、复琐事务等高级操做带来了阻碍。所以,若是你的数据的逻辑结构很是复杂,常常须要进行复杂的多表查询或者事务操做,那显然仍是MySQL这类关系型数据库更合适。数据结构
得益于MongoDB的这些特色,MongoDB很适合那些表结构常常改变,数据的逻辑结构没又没那么复杂不须要多表查询操做,数据量又比较大的应用场景。例如,有一个游戏应用,须要存储每一个用户的信息,用户分为法师、战士等具备不一样属性的角色,还有装备、技能等不少结构复杂的信息,游戏每次更新还可能会引入不少新的用户属性,这时若是你使用MySQL,那么你可能须要创建不少个表,定义不少个表结构,而且游戏的每次更新也可能会给你带来重定义表结构等一堆麻烦事,而若是使用MongoDB则这些麻烦通通不存在,由于你能够定义只一张表即可以容纳全部的信息,并且能够随时根据新的需求增减字段。app
Redis是如今最热门的key-value数据库。它与MongoDB同在2009年发布,也一样是早期大数据时代的数据库表明做。oop
Redis的最大特色固然就是key-value存储所带来的简单和高性能了。所谓key-value存储,就是每一条记录只包含一个用于查询数据的Key,以及与之对应的存储数据的value,就如同现实生活中的门牌号与住户,而没有诸如表、字段这些常规数据库中必需有的复杂概念,全部的查询都仅仅依赖于key值。所以,key-value数据库可谓是数据库中数据结构最简单的一种,也得益于这种简单的结构,再加上Redis会把全部数据加载到内存中的,Redis能获得远高于MongoDB这类常规数据库的读写性能。固然,Redis的功能还不止key-value存储这么简单,相较它的key-value前辈Memcached,Redis还支持数据持久化,list、set等多种数据结构,主从复制备份等一些列功能,所以Redis绝对称得上是key-value数据库中功能最全面、最简单易用的款。性能
Redis的key-valule存储带来了性能这个优点,可是也给复杂查询带来了不少局限。因为阉割掉了数据表、字段这样的重要特性,且全部的查询都依赖key,所以Redis没法提供常规数据库所具有的多列查询、区段查询等复杂查询功能。同时,因为Redis须要把数据存在内存中,这也大大限制了Redis可存储的数据量,这也决定了Redis难以用在数据规模很大的应用场景中。大数据
Redis牺牲了常规数据库中的数据表、复杂查询等功能,换来了很大的性能提高,特别适合那些对读写性能要求极高,且数据表结构简单(key-value、list、set之类)、查询条件也一样简单的应用场景。若是你的数据表结构还挺复杂,你还常常须要作一些复杂查询操做,那你最好仍是老老实实用MongoDB或者SQL吧。搜索引擎
相较于MongoDB和Redis,晚一年发布的ES可能知名度要低一些,可是ES在搜索引擎领域的名声绝对是是响当当的。相较于其余高大上的数据库产品,ES的出身要屌丝不少。ES的建立者Shay Banon曾经是一个失业的屌丝程序员,在无事可干的时候为了方便老婆搜索食谱而建立了ES(固然,当时还不叫ES)。不料无意插柳柳成荫,成就了今天最热门的搜索引擎数据库,果真妹子才是程序员工做的最大动力啊!ES也专门成立了本身的Elastic公司已经得到数亿美金融资,当年的屌丝程序员Shay Banon也早已逆袭成为CEO并走上人生巅峰。诸位程序员看官读完这个故事是否是也已经开始心里澎湃的想象本身出任CEO迎娶白富美那一天了?spa
ES的特色,正如其名,那就是搜索。严格的说,ES不是一个数据库,而是一个搜索引擎,ES的方方面面也都是围绕搜索设计的。ES支持全文搜索,这里简单解释下什么是全文搜索:对于“我在北京的一家互联网公司工做”这样的数据,若是你搜索“北京”、“互联网”、“工做”这些关键词都能命中这条数据的话,这就是全文搜索,你天天都在用的百度、Google都属于全文搜索。值得一提的是,ES的全文搜索对中文也有很好的支持(单是中文分词器就有不少种),绝对可以知足国内大多数人的全文搜索需求。除了搜索以外,ES还会自动的替你对全部字段创建索引,以实现高性能的复杂聚合查询,所以只要是存入ES的数据,不管再复杂的聚合查询也能够获得不错的性能,并且你不再用为如何创建各类复杂索引而头痛了。
说了这么多ES的优势,你是否是以为ES简直万能了?惋惜不是的,ES也有不少的短处,最明显的就是字段类型没法修改、写入性能较低和高硬件资源消耗。前边讲到ES会自动的替你创建索引,尽管这能给全文搜索以及聚合查询带来不少好处还能替你省了建索引这一麻烦事,可是这个特性也会带来一堆问题。ES须要在建立字段前要预先创建Mapping,Mapping中包含每一个字段的类型信息,ES须要根据Mapping为字段创建合适的索引。因为这个Mapping的存在,ES中的字段一但创建就不能再修改类型了。(例如,你建的数据表的某个字段忘了加全文搜索,你想临时加上,可是表已经建好而且已经有不少数据了,这时候该怎么办呢?很差意思,你只能把整个数据表删了再重建一遍!)所以,ES在数据结构灵活度上高于MySQL但远不如MongoDB。ES的缺点还不止这些,自动创建索引使得ES的写入性能也收到了影响,要明显低于MongoDB。对于一样的数据ES占用的存储空间也要明显大于MongoDB(建那么多索引能不占空间吗?),对硬件资源的消耗也是很是厉害,大数据量下64G内存+SSD基本是标配,算得上是数据库中的贵族服务了,所以若是你的老板很小气,对于ES的选用可要慎重喽!
ES的全文搜索特性使它成为构建搜索引擎的利器。除此以外,ES很好的支持了复杂聚合查询这一特色还使得ES很是适合拿来做数据分析使用。其实,ES还专门作了与本身配套的ELK套装,给你提供从日志收集到数据可视化分析的一条龙服务,绝对是构建高大上数据分析平台的利器。可是,ES的高成本和低写入性能这些缺点也注定了它不适合用在那些数据价值不高、对写入性能有要求、数据量大而成本受限的场景中。
HBase是Hadoop项目的一部分,并且是当年谷歌大数据三驾马车之一的BigTable方案的实现,所以绝对算得上是大数据时代最有表明性的技术之一了。
做为Hadoop系列产品之一,HBase也继承了Hadoop项目的最大优势,那就是对海量数据的支持,以及极强的横向(存储容量)扩展能力。和Redis相似,HBase也须要为每一行数据定义一个key,以后全部的查询都依赖这个key进行。可是不一样的地方在于,HBase中的一行数据还能够有很是多的列项(相似MongoDB字段),数据会按照列进行分组和存储,同一列的数据存储在同一个地方,这也是HBase被称为列式存储数据库的缘由。其实从本质上来讲,HBase至关因而把逻辑上的一张大表按照列族分拆成若干张小表分别进行存储,不只是列,数据的行数到达必定数量后表也会再被拆分。所以,HBase可以把巨大的表分布到不少台机器上,从而容纳规模近乎无限的数据。同时,对HBase进行横向扩展也很是方便,你基本只须要添加新的机器,而不用对数据作任何改动,就能够实现数据库容量线性的增加,这在其余SQL数据库中是难以作到的(尽管其余数据库也有诸如MongoDB分片集群之类的功能帮助你进行数据规模横向扩展,可是不管是在实施的难度上仍是在对数据的影响方面这些都没法跟HBase相提并论。)
HBase的列式存储特性带来了海量数据规模的支持和极强的扩展能力,可是也给数据的读取带来很大的局限。因为只有同一列族的数据才会被存放在一块儿,并且全部的查询都必需要依赖Key,这就使得不少复杂查询难以进行。例如,若是你的查询条件涉及多个列项,或者你没法获取要查询数据的key,那么查询效率将会很是低下。所以,HBase仅仅适合。
HBase的列式存储特色带来了对海量数据的容纳能力,所以很是适合数据量极大,查询条件简单,列与列之间联系不大的轻查询应用场景。最典型的好比搜索引擎所使用的网页数据库。HBase不适合数据结构复杂,且须要复杂查询的应用场景。另外值得一提的是,HBase是很重的一款产品,须要依赖不少的Hadoop组件,所以若是你的数据规模不大,那就彻底不必杀鸡用牛刀,MongoDB这类产品彻底能够更好的知足你的需求。
以上四种数据库是当今NoSQL中最火爆的几款,掌握了它们,你基本就能cover住互联网开发中的绝大多数数据存储需求。这里还想强调的一点是,如同买衣服同样,没有最好的数据库,只有最适合你的应用场景的数据库,所以选用一款数据库前必定要想清楚本身的应用场景是否合适。再给你们总结下这些数据库的适用场景:
若是你对数据的读写要求极高,而且你的数据规模不大,也不须要长期存储,选redis;
若是你的数据规模较大,对数据的读性能要求很高,数据表的结构须要常常变,有时还须要作一些聚合查询,选MongoDB;
若是你须要构造一个搜索引擎或者你想搞一个看着高大上的数据可视化平台,而且你的数据有必定的分析价值或者你的老板是土豪,选ElasticSearch;
若是你须要存储海量数据,连你本身都不知道你的数据规模未来会增加多么大,那么选HBase。
四种数据库的对比
最后,再给你们来个更加形象的对比:
Redis:
MongoDB:
HBase:
ElasticSearch: