mongodb研究(mongodb 内存数据库)

摘要:
但mongodb不是一个纯内存数据库。甚至我也不认为它属于内存数据库。然后,mongodb修改该区域中的数据,以避免碎片化的硬盘操作。事实上,我不想谈论Redis和Mongodb的性能。我只想解释一下Redis、Mongodb和MySQL是如何随着数据量的增长而变化的。当物理内存不足时,Redis和Mongodb都将使用虚拟内存。Mongodb仍然可以保证性能。有人使用mongodb来存储T的数据。

本日志大部分都不是原创的转载复制的会带链接保持版权

工作中使用mongodb已经好久了,讽刺的是到了最后快离职的时候才有时间好好研究下源码。
 
印象:mongodb是一个内存数据库,数据都是放到内存里面的,所以速度上不比redis慢。
 
想法:
mongodb对数据的操作大部分都在内存中。但mongodb并不是单纯的内存数据库。甚至个人认为不属于内存数据库。
相反,redis就是一个不折不扣的内存数据库了,mysql一个不折不扣的硬盘数据库。我们对比下。
 
持久化方式:
redis所有数据都是放在内存中的,持久化是使用RDB方式或者aof方式。(http://blog.nosqlfan.com/html/3813.html
 
 
mongodb的所有数据实际上是存放在硬盘的,所有要操作的数据通过mmap的方式映射到内存某个区域内。
然后,mongodb就在这块区域里面进行数据修改,避免了零碎的硬盘操作。
至于mmap上的内容flush到硬盘就是操作系统的事情了,所以,如果,mongodb在内存中修改了数据,然后,mmap数据flush到硬盘之前,系统当机了,就会丢失数据了。
 
mysql,无论数据还是索引都存放在硬盘中。到要使用的时候才交换到内存中。能够处理远超过内存总量的数据。
 
数据量和性能
当物理内存够用的时候,redis》mongodb》mysql
 
mysql垫底是肯定的。至于,redis为什么比mongodb快。还是跟场景和使用业务有关系的。
大部分情景下,由于mongodb要兼顾它特有的弱表结构下复杂的查询,在很多存取过程上做了妥协。
其实,这里并不想说redis和mongodb的性能怎样,只想说明下随着数据量的增长,redis和mongodb,mysql是怎么变化的。
 
当物理内存不够用的时候
redis和mongodb都会使用虚拟内存。
实际上如果redis要开始虚拟内存,那很明显要么加内存条,要么你换个数据库了。
但是,mongodb不一样,只要,业务上能保证,冷热数据的读写比,使得热数据在物理内存中,mmap的交换较少。mongodb还是能够保证性能。有人使用mongodb存储了上T的数据。
mysql,mysql根本就不需要担心数据量跟内存下的关系。不过,内存的量跟热数据的关系会极大地影响性能表现。
 
当物理内存和虚拟内存都不够用的时候
估计除了mysql你没什么好选择了。
 
 
其实,从数据存储原理来看,我更倾向于将mongodb归类为硬盘数据库,但是使用了mmap作为加速的手段而已。
 
mmap的资料这里:
http://hi.baidu.com/b_a_i_du/item/8c91ebcce2b24326a1b50a61
http://www.cnblogs.com/techdoc/archive/2010/12/22/1913521.html
 
简单来说就是:
mmap系统调用并不是完全为了用于共享内存而设计的。它本身提供了不同于一般对普通文件的访问方式,进程可以像读写内存一样对普通文件的操作。
 
mmap系统调用使得进程之间通过映射同一个普通文件实现共享内存。普通文件被映射到进程地址空间后,进程可以像访问普通内存一样对文件进行访问,不必再调用read(),write()等操作。mmap并不分配空间, 只是将文件映射到调用进程的地址空间里, 然后你就可以用memcpy等操作写文件, 而不用write()了.写完后用msync()同步一下, 你所写的内容就保存到文件里了. 不过这种方式没办法增加文件的长度, 因为要映射的长度在调用mmap()的时候就决定了.

免责声明:文章转载自《mongodb研究(mongodb 内存数据库)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇误删节点或集群怎么办?这里有一颗后悔药Windows版Jenkins+SVN+Maven自动化部署环境搭建【转】下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

为什么索引可以让查询变快?终于有人说清楚了!

概述 人类存储信息的发展历程大致经历如下: 由于是个人凭着自己理解总结的,因此可能不一定精确,但是毋庸置疑的是,在当代,各大公司机构部门的数据都是维护在数据库当中的。数据库作为数据存储介质发展的最新产物,必然是具有许多优点的,其中一个很大的优点就是存储在数据库中的数据访问速度非常快。 数据库访问速度快的一个很重要的原因就在于索引index的作用。也就是这...

hadoop HDFS扩容

1.纵向扩容(添加硬盘) 1.1 添加硬盘 确定完成添加,运行 lsblk 查看硬盘使用情况 1.2 硬盘分区 fdisk /dev/sdb #对新硬盘sdb进行分区 m 帮助 n 添加一个分区 p 选择主分区 q 不保存退出 w 保存并退出 centerOS7的默认文件系统是xfs,centerOS6默认的文件系统是ext4 mk...

redis 中文存储乱码问题

在redis 中存储中文,读取会出现乱码(其实不是乱码,只是不是我们存的中文显示) 1 redis> set test "我们" 2 OK 3 redis> get test 4 "xe6x88x91xe4xbbxac" 如何在get时取到它的中文呢?只需要在redis-cli 后面加上--raw redis> get...

用jedis执行lua脚本

1.Redis 脚本 Redis 脚本使用 Lua 解释器来执行脚本。 Redis 2.6 版本通过内嵌支持 Lua 环境。执行脚本的常用命令为EVAL。 下表列出了 redis 脚本常用命令: 序号 命令及描述 1 EVAL script numkeys key [key ...] arg [arg ...]执行 Lua 脚本。 2 EVAL...

五,自定义监控项并创建图形

目录 五,zabbix自定义监控项 一,为什么要自定义监控项 二,自定义监控项中的基础概念 三,自定义监控项配置 1,自定义监控项基本格式 2,在agent上自定义监控项 3,web页面添加监控项 4,为该监控项创建一个图形 五,zabbix自定义监控项 一,为什么要自定义监控项 有的时候zabbix提供的监控项目,不能满足我们生产环境下...

MongoDB 对象主键 ObjectId

常规主键 生成 > ObjectId() ObjectId("5d7f4c36a7b5867462dee50e") 提取生成的时间 > ObjectId("5d7f4c36a7b5867462dee50e").getTimestamp() ISODate("2019-09-16T08:47:50Z") 复合主键 主键也可以使用对象来表示,即...