当前位置:  数据库>nosql
本页文章导读:
    ▪nosql数据库      介绍MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。主要解决的是海量数据的访问效率问题,为WEB应用提供可扩展的高性能数据存储解决方案。当数据量达到50GB以上的时候,MongoDB.........
    ▪mongodb持久化      (根据  https://docs.google.com/drawings/edit?id=1TklsmZzm7ohIZkwgeK6rMvsdaR13KjtJYMsfLr175Zc  重画 ) 开启journal的情况,数据文件映射到内存2个view:private view和write view。对write view的更新会刷新到.........
    ▪MongoDB 聚合      MongoDB除了基本的查询功能,还提供了很多强大的聚合工具,其中简单的可计算集合中的文档个数,复杂的可利用MapReduce做复杂数据分析. 1.countcount返回集合中的文档数量db.refactor.count()不管集合.........

[1]nosql数据库
    来源:    发布时间: 2013-10-18

介绍

MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。主要解决的是海量数据的访问效率问题,为WEB应用提供可扩展的高性能数据存储解决方案。当数据量达到50GB以上的时候,MongoDB的数据库访问速度是MySQL的10倍以上。MongoDB的并发读写效率不是特别出色,根据官方提供的性能测试表明,大约每秒可以处理0.5万~1.5万次读写请求。MongoDB还自带了一个出色的分布式文件系统GridFS,可以支持海量的数据存储。

MongoDB也有一个Ruby的项目MongoMapper,是模仿Merb的DataMapper编写的MongoDB接口,使用起来非常简单,几乎和DataMapper一模一样,功能非常强大。

MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

所谓“面向集合”(Collenction-Orented),意思是数据被分组存储在数据集中,被称为一个集合(Collenction)。每个 集合在数据库中都有一个唯一的标识名,并且可以包含无限数目的文档。集合的概念类似关系型数据库(RDBMS)里的表(table),不同的是它不需要定 义任何模式(schema)。
模式自由(schema-free),意味着对于存储在mongodb数据库中的文件,我们不需要知道它的任何结构定义。如果需要的话,你完全可以把不同结构的文件存储在同一个数据库里。
存储在集合中的文档,被存储为键-值对的形式。键用于唯一标识一个文档,为字符串类型,而值则可以是各中复杂的文件类型。我们称这种存储形式为BSON(Binary Serialized dOcument Format)。

MongoDB服务端可运行在Linux、Windows或OS X平台,支持32位和64位应用,默认端口为27017。推荐运行在64位平台,因为MongoDB在32位模式运行时支持的最大文件尺寸为2GB。

MongoDB把数据存储在文件中(默认路径为:/data/db),为提高效率使用内存映射文件进行管理。

特性

它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有:

  • 面向集合存储,易存储对象类型的数据。
  • 模式自由。
  • 支持动态查询。   
  • 支持完全索引,包含内部对象。   
  • 支持查询。   
  • 支持复制和故障恢复。   
  • 使用高效的二进制数据存储,包括大型对象(如视频等)。   
  • 自动处理碎片,以支持云计算层次的扩展性。   
  • 支持RUBY,PYTHON,JAVA,C++,PHP,C#等多种语言。   
  • 文件存储格式为BSON(一种JSON的扩展)。   
  • 可通过网络访问。
  • 官方网站

    http://www.mongodb.org/

    2、CouchDB

    介绍

    Apache CouchDB 是一个面向文档的数据库管理系统。它提供以 JSON 作为数据格式的 REST 接口来对其进行操作,并可以通过视图来操纵文档的组织和呈现。 CouchDB 是 Apache 基金会的顶级开源项目。

    CouchDB是用Erlang开发的面向文档的数据库系统,其数据存储方式类似Lucene的Index文件格式。CouchDB最大的意义在于它是一个面向Web应用的新一代存储系统,事实上,CouchDB的口号就是:下一代的Web应用存储系统。

    特性

    主要功能特性有:

  • CouchDB是分布式的数据库,他可以把存储系统分布到n台物理的节点上面,并且很好的协调和同步节点之间的数据读写一致性。这当然也得以于Erlang无与伦比的并发特性才能做到。对于基于web的大规模应用文档应用,然的分布式可以让它不必像传统的关系数据库那样分库拆表,在应用代码层进行大量的改动。
  • CouchDB是面向文档的数据库,存储半结构化的数据,比较类似lucene的index结构,特别适合存储文档,因此很适合CMS,电话本,地址本等应用,在这些应用场合,文档数据库要比关系数据库更加方便,性能更好。  
  • CouchDB支持REST API,可以让用户使用JavaScript来操作CouchDB数据库,也可以用JavaScript编写查询语句,我们可以想像一下,用AJAX技术结合CouchDB开发出来的CMS系统会是多么的简单和方便。其实CouchDB只是Erlang应用的冰山一角,在最近几年,基于Erlang的应用也得到的蓬勃的发展,特别是在基于web的大规模,分布式应用领域,几乎都是Erlang的优势项目。
  • 官方网站

    http://couchdb.apache.org/

    3、Hbase

    介绍

    HBase是一个分布式的、面向列的开源数据库,该技术来源于Chang et al所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”。就像Bigtable利用了Google文件系统(File System)所提供的分布式数据存储一样,HBase在Hadoop之上提供了类似于Bigtable的能力。HBase是Apache的Hadoop项目的子项目。HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库.另一个不同的是HBase基于列的而不是基于行的模式。

    HBase – Hadoop Database,是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用HBase技术可在廉价PC Server上搭建起大规模结构化存储集群。   HBase是Google Bigtable的开源实现,类似Google Bigtable利用GFS作为其文件存储系统,HBase利用Hadoop HDFS作为其文件存储系统;Google运行MapReduce来处理Bigtable中的海量数据,HBase同样利用Hadoop MapReduce来处理HBase中的海量数据;Google Bigtable利用 Chubby作为协同服务,HBase利用Zookeeper作为对应。


        
    [2]mongodb持久化
        来源:    发布时间: 2013-10-18


    (根据  https://docs.google.com/drawings/edit?id=1TklsmZzm7ohIZkwgeK6rMvsdaR13KjtJYMsfLr175Zc  重画 )

     

    开启journal的情况,数据文件映射到内存2个view:private view和write view。对write view的更新会刷新到磁盘,而对private view的更新不刷新到磁盘。

    (1) 写操作先发生在private view,并记录下日志。

    (2) 把所有日志组织成一个log buffer。

    (3) 把log buffer写入到j._<n>文件中。

    (4) 把所有的写操作更新到write view(write view会定期的刷新到磁盘)

    (5) private view在一定的条件下会进行remap操作

     

    事实上,数据库的读写操作都在private view进行。private view是copy on write的,即在发生写时开辟新的内存,否则是和write view共用一块内存的。如果写操作很频繁,则private view会申请很多的内存,所以private view在一定条件下会remap,防止占用内存过多。

     

    不开启journal时,只有一个write view,读写操作都发生在write view上。

     


    关于remapview操作的一个性能问题
    在_REMAPPRIVATEVIEW()函数中,有这样一段代码:



    #if defined(_WIN32)
    // Note that this negatively affects performance.
    // We must grab the exclusive lock here because remapThePrivateView() on Windows needs
    // to grab it as well, due to the lack of a non-atomic way to remap a memory mapped file.
    // See SERVER-5723 for performance improvement.
    // See SERVER-5680 to see why this code is necessary.
    LockMongoFilesExclusive lk;
    #else
    LockMongoFilesShared lk;
    #endif


    执行remapview时,需要LockMongoFiles锁。win32下,这把锁是排他锁;而其他平台下(linux等)是共享锁。write view刷新到磁盘的时候,也需要LockMongoFiles共享锁。这样,在win32下,如果在执行磁盘刷新操作,则remapview操作会被阻塞;而在执行remapview之前,已经获得了全局写锁,这样会阻塞所有的读写操作。因此,在win32平台下,太多的写操作(写操作越多,remapview越频繁)会导致整个数据库读写阻塞。


    在win32和linux下做了一个测试,不停的插入大小为10k的记录。结果显示如下:上图win32平台,下图为linux平台;横坐标为时间轴,从0开始;纵坐标为每秒的插入次数。很明显的,linux平台的性能比win32好很多。



    本文链接


        
    [3]MongoDB 聚合
        来源:    发布时间: 2013-10-18

    MongoDB除了基本的查询功能,还提供了很多强大的聚合工具,其中简单的可计算集合中的文档个数,

    复杂的可利用MapReduce做复杂数据分析.

     

    1.count

    count返回集合中的文档数量

    db.refactor.count()

    不管集合有多大,都能很快的返回文档数量.

    可以传递查询,MongoDB会计算查询结果的数量

    db.refactor.count({"username":"refactor"})

    但是增加查询条件会使count变慢.

     

    2.distinct

    distinct用来找出给定键的所有不同值.使用时必须指定集合和键.

    如:

    db.runCommand({"distinct":"refactor","key":"username"})

     

     3.group

    group先选定分组所依据的键,MongoDB将会将集合依据选定键值的不同分成若干组.然后可以通过聚合每一组内的文档,

    产生一个结果文档.

    如:

    db.runCommand(
    {
      "group":
      {
        "ns":"refactor",
        "key":{"username":true},
        "initial":{"count":0},
        "$reduce":function(doc,prev)
        {
          prev.count++;
        },
        "condition":{"age":{"$gt":40}}
      }
    }
    )

       "ns":"refactor",

    指定要进行分组的集合
        "key":{"username":true},

    指定文档分组的依据,这里是username键,所有username键的值相等的被划分到一组,true为返回键username的值
        "initial":{"count":0},

    每一组reduce函数调用的初始个数.每一组的所有成员都会使用这个累加器.
        "$reduce":function(doc,prev){...}

    每个文档都对应的调用一次.系统会传递两个参数:当前文档和累加器文档.

    "condition":{"age":{"$gt":40}}

    这个age的值大于40的条件

     

    4.使用完成器

    完成器用于精简从数据库传到用户的数据.group命令的输出一定要能放在单个数据库相应中.

    "finalize"附带一个函数,在数组结果传递到客户端之前被调用一次.

    db.runCommand(
      {
        "group":
        {
          "ns":"refactor",
          "key":{"username":true},
          "initial":{"count":0},
          "$reduce":function(doc,prev)
          {
            prev.count++;
          },
          "finalize":function(doc)
          {
            doc.num=doc.count;
            delete doc.count;
          }
        }
      }
    )

    finalize能修改传递的参数也能返回新值.

     

    5.将数组作为键使用

    有些时候分组所依据的条件很复杂,不仅是一个键.比如要使用group计算每个类别有多篇博客文章.由于有很多作者,

    给文章分类时可能不规律的使用了大小写.所以,如果要是按类别名来分组,最后"MongoDB"和"mongodb"就是不同的组.

    为了消除这种大小写的影响,就要定义一个函数来确定文档所依据的键.

    定义分组要用到$keyf

    db.runCommand(
     {
      "group":
       {
        "ns":"refactor",
        "$keyf":function(doc){return {"username":doc.username.toLowerCase()}},
        "initial":{"count":0},
        "$reduce":function(doc,prev)
           {
            prev.count++;
           }
       }
     }
    )

     

    6.MapReduce

    count,distinct,group能做的事情MapReduce都能做.它是一个可以轻松并行化到多个服务器的聚合方法.它会

    拆分问题,再将各个部分发送到不同机器上,让每台机器完成一部分.当所有机器都完成时候,再把结果汇集起来形成

    最终完整的结果.

    MapReduce需要几个步骤:

    1.映射,将操作映射到集合中的每个文档.这个操作要么什么都不做,要么 产生一个键和n个值.

    2.洗牌,按照键分组,并将产生的键值组成列表放到对应键中.

    3.化简,把列表中的值 化简 成一个单值,这个值被返回.

    4.重新洗牌,直到每个键的列表只有一个值为止,这个值就是最终结果.

    MapReduce的速度比group慢,group也很慢.在应用程序中,最好不要用MapReduce,可以在后台运行MapReduce

    创建一个保存结果的集合,可以对这个集合进行实时查询.

     

    找出集合中的所有键

    MongoDB没有模式,所以并不知晓每个文档有多少个键.通常找到集合的所有键的做好方式是用MapReduce.

    在映射阶段,想得到文档中的每个键.map函数使用emit 返回要处理的值.emit会给MapReduce一个键和一个值.

    这里用emit将文档某个键的记数(count)返回({count:1}).我们为每个键单独记数,所以为文档中的每一个键调用一次emit,

    this是当前文档的引用:

    map=function(){
      for(var key in this)
      {
        emit(key,{count:1})
      }
    };

    这样返回了许许多多的{count:1}文档,每一个都与集合中的一个键相关.这种有一个或多个{count:1}文档组成的数组,

    会传递给reduce函数.reduce函数有两个参数,一个是key,也就是emit返回的第一个值,另一个参数是数组,由一个或者多个

    对应键的{count:1}文档组成.

    reduce=function(key,emits){
      total=0;
      for(var i in emits){
        total+=emits[i].count;
      }
      return {count:total};
    }

    reduce要能被反复被调用,不论是映射环节还是前一个化简环节.reduce返回的文档必须能作为reduce的

    第二个参数的一个元素.如x键映射到了3个文档{"count":1,id:1},{"count":1,id:2},{"count":1,id:3}

    其中id键用于区别.MongoDB可能这样调用reduce:

    >r1=reduce("x",[{"count":1,id:1},{"count":1,id:2}])

    {count:2}

    >r2=reduce("x",[{"count":1,id:3}])

    {count:1}

    >reduce("x",[r1,r2])

    {count:3}

    reduce应该能处理emit文档和其他reduce结果的各种集合.

    如:

    mr=db.runCommand(
      {
      "mapreduce":"refactor",
      "map":map,
      "reduce":reduce,
      "out":{inline:1}
      }
    )

    或:

    db.refactor.mapReduce(map,reduce,{out:{inline:1}})

    "timeMillis" : 5,//操作花费的时间
    "counts" : {
    "input" : 10,//发往到map函数的文档个数
    "emit" : 40,//在map函数中emit被调用的次数
    "reduce" : 4,//在map函数中reduce被调用的次数
    "output" : 4//结果集合中创建的文档数量.
    },

    1.mapreduce是根据map函数里调用的emit函数的第一个参数来进行分组的
    2.仅当根据分组键分组后一个键匹配多个文档,才会将key和文档集合交由reduce函数处理

    注意MongoDB 1.8版本以上,必须指明 out 参数

    否则会报如下错误:

    "assertion" : "'out' has to be a string or an object",
    "assertionCode" : 13606,

     

    MapReduce中的其他键

    mapreduce,map,reduce这三个键是必须的,MapReduce命令还有其他的可选键

    finalize:函数

    将reduce的结果发送给这个键,这是处理过程的最后一步

    keeptemp:布尔值

    连接关闭时,临时结果是否保存

    output:字符串

    结果集合的名字,设定该项则隐含着keeptemp:true

    query:文档

    会在发往map函数前,先用指定条件过滤文档

    sort:文档

    会在发往map函数前先给文档排序

    limit:整数

    发往map函数文档的最大数量

    scope:文档

    javascript代码中要用到的变量

    verbose:布尔值

    是否产生更加信息的服务器日志 

    本文链接


        
    最新技术文章:
    ▪30G 的redis 如何优化 - 沐訫    ▪[教程]MongoDB 从入门到进阶 (User系统) - magicD...    ▪Redis使用总结之与Memcached异同 - ceecy
    ▪MongoDB学习 (六):查询 - 辞职回家卖烧饼    ▪在.net中使用aquiles访问Cassandra(一) - amwicfai    ▪在.net中使用aquiles访问Cassandra(二) - amwicfai
    ▪高性能队列Fqueue的设计和使用实践 - 蒋叶湖    ▪MongoDB开发学习 - 喵 喵    ▪MongoDB开发学习 - 喵 喵
    ▪Spring-MongoDB简单操作 - CN.programmer.Luxh    ▪MongoDB 聚合 - 蒋叶湖    ▪nosql数据库 - 蒋叶湖
    ▪Spring-MongoDB简单操作    ▪Redis源码研究--字典    ▪Redis源码研究--字典 - feiyunruyue
    ▪[译]Cassandra 架构简述    ▪[译]Cassandra 架构简述    ▪Spring-MongoDB简单操作
    ▪MongoDB 聚合    ▪NoSQL生态系统    ▪NoSQL生态系统
    ▪nosql数据库    ▪mongodb持久化    ▪MongoDB 聚合
    ▪CentOS 6上的redis搭建实战记录    ▪非关系型数据库的研究与实践    ▪高性能队列Fqueue的设计和使用实践
    ▪php中使用memcached的性能问题    ▪NoSQL架构实践(二)——以NoSQL为主    ▪NoSQL架构实践(三)——以NoSQL为缓存
    ▪在MongoDB中一起使用$or和sort()时,查询性能差...    ▪[转]NoSQL生态系统    ▪NoSQL数据库探讨之一 - 为什么要用非关系数...
    ▪初识Redis及Redis在Windows下的安装和使用    ▪MongoDB 开发学习    ▪Redis.conf
    ▪关于twemproxy和redis分布式    ▪NoSQL学习之路(四):创建、读取、更新、删除...    ▪NoSQL学习之路 (五):查询操作符(Query Operators).1st...
    ▪NoSQL学习之路(三):MongoDB Shell的使用    ▪NoSQL学习之路 (二):MongoDB 数据类型和基本...    ▪NoSQL学习之路 (一):MongoDB 环境的搭建
    ▪NoSQL学习之路 (一):mongoDB 环境的搭建    ▪NoSQL学习之路 (一):mongoDB 环境的搭建和shel...    ▪NoSQL学习之路 (二):mongoDB 数据类型和基本...
    ▪那点所谓的分布式——redis    ▪mongodb查询嵌入式文档    ▪NoSQL历史简介
    ▪Mongo服务器集群配置学习三——分片    ▪MongoDB 导出和导入命令的使用    ▪HBase常用的数据库API操作
    ▪启动HBase后遇到的一个问题    ▪Mongo服务器集群配置学习一——主从复制    ▪Mongo服务器集群配置学习二——副本集
    ▪完全分布式安装HBase    ▪搞一些好玩的东西——redis    ▪Tair监控及统计技巧
    ▪MongoDB 之旅(四) 深入学习    ▪MongoDB 问题123    ▪MongoDB——安装部署以及简单的运用
    ▪MongoDB 之旅(一) 简介    ▪MongoDB 之旅(二) 基本操作(MongoDB Javascript Sh...    ▪MongoDB 之旅(三) 基本管理(MongoDB Javascript Sh...
    ▪mongoDB之windows下安装mongo数据库服务    ▪mongoDB之数据备份恢复工具    ▪CentOS通过yum安装CouchDB
    ▪MongoDB从入门到提高【第一集】---------MongdoDB配...    ▪MongoDB从入门到提高【第二集】---------MongdoDB权...    ▪[教程]MongoDB 从入门到进阶 (TextSearch)
    ▪mongodb数据文件格式    ▪在Window平台安装MongoDB    ▪mongodb journal文件格式
     


    站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3