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