
春节前闲来无事,整理了一下以前学习的Node.js和NoSql的资料,总结了自己一路踩过来的坑,希望能对初学者有帮助。
在开发环境搭建和实例编写之前,还是需要先了解一下基本概念。
参考文章:
1. 目前流行的几个NoSql对比
2. 深入了解MongoDB的mmap(内存映射文件)的原理
3. MongoDB命令
4. Node.js的概念
5. 事件循环,Node.js的核心概念
6. JavaScript:彻底理解同步,异步和事件循环
7. nodejs async库使用
长篇大论的概念我就不复述了,用几句简单的话来概括一下重点:
1. NoSql
NoSql=not only sql,与传统关系型的最大区别在于,不能JOIN,且保存的数据没有固定的格式,常见的如MongoDB以key-value形式进行存储。
与传统如MySql是硬盘+关系型相反,NoSql是内存+非关系型。
硬盘的数据可靠性高,因为数据是直接写入硬盘。内存读写速度更快,因为是直接通过内存进行存取,但是需要定期写回到硬盘,这就导致在存入内存到写入硬盘的时间内,如果系统崩溃,会导致数据丢失,可靠性会降低,虽然有通过日志在启动后进行恢复的方法,但是多少还是会影响体验。
所以到底是用关系型还是NoSql,还是要根据场景进行分析,不能一概而论。
2. MongoDB
内存映射文件是OS通过mmap在内存中创建一个文件,并直接映射到虚拟内存。在数据操作的时候,OS会把需要操作的数据直接映射到物理内存中。
MongoDB通过journal进行故障恢复和持久化,系统在内存中分配一块区域给journal使用,称为private view。每隔100ms会刷新privateview到journal。因此发生故障时,丢失的也只是100ms的数据而已。但是开启journal后,虚拟内存的使用也会倍增。dat视频文件如何打开方式
3. Node.js
Node是服务器程序。本身运行的是Google的V8引擎,用于解释Javascript。它可以直接用Javascript写后台程序,使前台开发者也能快速开发后台代码,即HTML+Javascript+MongoDB,而无需像Tomcat的前台(HTML+Javascript)+后台(Java)+(MySql)。
与Java等不同的是它连接到服务器的方式:
Java是多线程的,一个连接就是一个新线程,每个线程需要2M的配套内存的话,8G内存就只能维持4000个用户,想要达到更高的连接数只能增加增加服务器。
Node.js是单线程的,它支持数万的并发,在处理非计算型高密集I/O请求时,可以有更好的表现。
为什么是非计算型?
因为Node.js虽然称为单线程,但并不意味着只有一个线程在进行处理,单的是主线程,还有其他如Ajax线程,MongoDB线程进行其他的处理。
如当主线程调用Ajax线程时,主线程并不是等待Ajax线程返回结果,而是直接跳到下一步操作,Ajax线程结束后会去执行它的回调函数,这是同步和异步的差异。
此时,主线程可以去做其他的请求。
借一张图来说明处理的流程:
但是如果主线程的计算量很大,由于是单线程的关系,其他请求就无法进入主线程了。
为什么用内存(MongoDB)?
用Node.js就是追求性能和并发,而传统的关系型(如MySql)在读写性能方面不如内存,如果是Node.js+关系型的话,这边势必将称为I/O的瓶颈。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/shumachanpin/article-74050-1.html
更新了之后
给它留个记性免得在来同时也当军演了练练手
5%每年