mongodb初步使用体验
前言
Mongodb是一个非常有名的缓存数据库,和它名气相当的还有redis和hbase。笔者之前使用过redis,memcache和elasticsearch,借着工作机会,正好可以好好学习一下mongodb。
安装,部署
笔者在百度搜索下的mongodb官网上没有看到直接的下载链接,反而还要注册,比较麻烦。最后是在一篇博文里找到了直接的下载地址。直接选择一个较新的以msi为后缀的下载地址下载即可(笔者的环境是windows7 64位环境)。php的mongodb扩展也可搜索下载即可。在windows下每次启动mongodb需要在cmd进入对应目录启动,比较繁琐。按照这篇博文的做法,可以将mongodb注册为windows的一个服务,使用起来就非常的方便了。
笔者使用的ide是netbean8.2,在里面插件管理搜索mongodb可以找到一款小型的mongodb可视化插件,对于简单的mongodb管理已经足够了。
定义
MongoDB 是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。(来源:百度百科)
让我们来仔细分析下定义:
1)分布式文件存储。 这个名词听着就很厉害。顾名思义,就是存储的内容不在一台主机上,而是可以有多个节点主机,数据分散存在上面。 通过进一步查资料了解到, 对于客户端来说,无需知道数据被拆分了,也无需知道服务端哪个分片对应哪些数据。数据在分片之前需要运行一个路由进程,进程名为mongos。这个路由器知道所有数据的存放位置,知道数据和片的对应关系。好吧,的确很神奇。具体可以参考《浅谈MongoDB数据库分布式存储管理》。对于redis,也有类似的集群和分布式解决方案,比如Redis Sharding(应用时间较长)和Redis Cluster(redis3.0推出的官方解决方案),参考知乎的这个回答。
2)介于关系数据库和非关系数据库。
关系型数据库是指mongodb有着类似于传统关系型数据库的组织结构。参考下面的对比:
RDBMS: 数据库(DATABASE) ==》 表(TABLE) ==》 行(ROW) ==> 列(COLUMN)==》 表联合(TABLE JOI) ==>主键(PRIMARYKEY)
MONGODB:数据库(DATABASE) ==》 集合(COLLECTION) ==》 文档(DOCUMENT) ==> 字段(FIELD) ==》内嵌文档(embeded docment) ==>主键.key为_id(PRIMARYKEY)

我们可以用类似于sql语句中的增删改查的语句去操作mongodb,虽然有些麻烦,但还是可以很快上手的。
另一方面。mongodb也是一个非关系型数据库。mongodb其实没有严格意义的行和列,而是将数据存储成文档。数据结构由键值(key=>value)对组成,MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。
结构

- MongoDB在数据存储上按命名空间来划分,一个collection是一个命名空间,一个索引也是一个命名空间
- 同一个命名空间的数据被分成很多个Extent,Extent之间使用双向链表连接
- 在每一个Extent中,保存了具体每一行的数据,这些数据也是通过双向链接连接的
- 每一行数据存储空间不仅包括数据占用空间,还可能包含一部分附加空间,这使得在数据update变大后可以不移动位置
- 索引以BTree结构实现
存储策略

以上是mongodb3.0的数据存储模型。mongodb3.0开始支持WiredTiger存储引擎,In-Memory引擎也支持不过是企业级别需要收费。以下图标做个对比:

可以看到WiredTiger数据引擎,支持文档级锁(多个客户端可以并发的修改一个集合中多个不同的文档),提高了并发性。
对于持久化,WiredTiger的做法是:在一个操作开始时,WiredTiger会拷贝该时间点的事务数据快照(snapshot)。快照表示的是内存中数据的一份一致性的视图。WiredTiger也会以数据一致的方式将快照中的所有数据写到磁盘所有数据文件中,并且记录一个检查点(checkpoint),这个检查点还可以扮演恢复点(recovery points)的角色,当MongoDB崩溃重启后,MongoDB可以从最后有效的检查点进行恢复。
众所周知,mongodb的一大优势就是可以使用磁盘来存储数据。那么mongodb和操作系统,磁盘的数据交换机制是怎样的呢?参考这篇文章得到答案。虽然介绍的是MMAP存储引擎的机制。但也大同小异。利用操作系统的内存映射,映射到一个虚拟内存的区域。虚拟内存再对应物理内存,如果访问的数据不在物理内存中,则将数据从磁盘加载到物理内存中。
- 有了内存映射文件,要访问的数据就好像都在内存里面,简单化了MongoDB访问和修改数据的逻辑
- MongoDB读写都只是和虚拟内存打交道,剩下都交给OS打理
- MongoDB占用内存比redis高,一般适合大数据量存储
优缺点
优点:
- 类似于传统数据库的数据访问方式,支持索引,数据组织更加灵活;
- 官方提供了分片和主从复制的相关解决方案,使得在设置集群服务器方面更有优势;
- 适合大数据量存储,依赖系统虚拟内存,采用镜像文件存储;内存占用率比较高;
- 内置数据分析功能(mapreduce)
缺点:
- 访问的QPS不及redis;
- 不支持事务;
- 3.0版本以下,不要长时间占用写锁,会导致锁表。(3.0以上版本采用WiredTiger存储引擎,据说是document锁,不知道性能如何)。
总结
以上,只是我初次使用mongodb的一点学习总结,很多地方不完善,原理也不是很透彻,甚至不少是直接引用网上别人的文章语句。但我觉得,这也是一个自己学习思考的过程,有必要记录下来。毕竟信息爆炸的时代,不是每个人都有时间和有必要去重读官方文档和深入了解细节,毕竟自己的理解还没有到达那个高度,容易掉入纸上谈兵的陷阱。在以后具体项目用到的时候再进行学习和总结也会更加的深刻一些。
参考文档:
mongodb初步使用体验的更多相关文章
- Github 的注册教程和初步使用体验
我叫许晴,是网工143的学生,学号是1413042064,兴趣包括手绘,看书和手游.学习过c++和汇编语言课程,但在编程方面没什么独立实践经验. 我的Githup用户名是 XQ123 .下面是我在gi ...
- mongodb初步使用
下载安装: 下载MongoDB:http://www.mongodb.org/. 安装MongoDB:傻瓜式安装 配置: 把bin目录添加到系统环境变量 启动: 打开一个 cmd编辑框,输入: mon ...
- MongoDB初步(一)
1.软件下载:mongodb-win32-x86_64-2008plus-ssl-3.4.1-signed.msi 2.下载补丁:hotfix kb2731284
- MongoDB Windows 下安装部署
下面主要是我在Windows上(Win7)安装.运行.安装Windows服务的笔记,以作备忘. 1.下载 下载地址:http://www.mongodb.org/downloads 从其下载页面就可以 ...
- MongoDB 走马观花(全面解读篇)
目录 一.简介 二.基本模型 BSON 数据类型 分布式ID 三.操作语法 四.索引 索引特性 索引分类 索引评估.调优 五.集群 分片机制 副本集 六.事务与一致性 一致性 小结 一.简介 Mong ...
- 了解 MongoDB 看这一篇就够了【华为云技术分享】
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/devcloud/article/detai ...
- 了解 MongoDB 看这一篇就够了【华为云分享】
目录 一.简介 二.基本模型 BSON 数据类型 分布式ID 三.操作语法 四.索引 索引特性 索引分类 索引评估.调优 五.集群 分片机制 副本集 六.事务与一致性 一致性 小结 一.简介 Mong ...
- [ASP.NET Core 3框架揭秘] 跨平台开发体验: Windows [下篇]
由于ASP.NET Core框架在本质上就是由服务器和中间件构建的消息处理管道,所以在它上面构建的应用开发框架都是建立在某种类型的中间件上,整个ASP.NET Core MVC开发框架就是建立在用来实 ...
- react-redux学习初步总结
1.index.js文件中需要引入 a.React(把jsx编译到js需要调用一个函数, 这个函数在React叫React.createElement. 解答地址:https://segmentfau ...
随机推荐
- Hdu2602 Bone Collector (01背包)
Problem Description Many years ago , in Teddy’s hometown there was a man who was called “Bone Collec ...
- Redis初探-Redis安装
官网地址:https://redis.io/download 最新版本是4.0,在这里本人下的是3.2 使用rz命令可以将Redis上传到Linux系统 首先要确定Linux上是否安装了gcc,没有则 ...
- 在python中使用正则表达式
一.转义符 1.在python中的转义符 (1)\\n与\n的区别 (2)r"\next" 通过r来进行转义 (3)"\\\\d"与"\\d" ...
- jQuery创建、删除和修改html标签
1.在父标签内创建子标签,新创建的子标签放在父标签最下面 $(parent).append(son).$(son).appendTo(parent) <div class="d&quo ...
- 配置firewalld端口转发
题:在系统 system1 设定端口转发,要求: 1.在172.24.8.0/24网络中的系统,访问system1的本地端口 5423 将被转发到 80 2.此设置必须永久有效 答: # 配置转发端口 ...
- ACM题集以及各种总结大全(转)
ACM题集以及各种总结大全! 虽然退役了,但是整理一下,供小弟小妹们以后切题方便一些,但由于近来考试太多,顾退役总结延迟一段时间再写!先写一下各种分类和题集,欢迎各位大牛路过指正. 一.ACM入门 关 ...
- 用python画小王八裤(turtle库)
一,采用Python语言如何画一朵玫瑰花 工具/原料 Python语言包 Win10 一. 准备 1. 打开界面: 打开python 2. 创建文件 二. 编程 1. 编写画图: from turtl ...
- 类自动调用to.string方法
所有对象都有toString()这个方法,因为它是Object里面已经有了的方法,而所有类都是继承Object,所以“所有对象都有这个方法” 它通常只是为了方便输出,比如System.out.prin ...
- 在VS2013 使用C语言库函数,出现出现错误,提示使用不安全函数use _CRT_SECURE_NO_WARNINGS
在VS 2013 中编译 C 语言项目,如果使用了 scanf 函数,编译时便会提示如下错误: error C4996: 'scanf': This function or variable may ...
- topcoder srm 580 div1
problem1 link 最优选择一定是在$2n$个端点中选出两个. problem2 link 分开考虑每个区间.设所有区间的左端点的最大值为$lc$,所有区间的右端点的最小值为$rc$.对于某个 ...