审核中~
溜忙之道
首页
溜忙手册
offer之道
项目Git
写文章
登录
·
注册
登录
没有账号,去注册
注册
已有账号,去登录
博客
基础问答
南易_站长
阅读量:6065
关注
基础问答
### Node的优缺点? **优点** * 使用js语法,简单,强大,轻量,可扩展 * 强大体现在非阻塞IO,可以适应分块传输数据,较慢的网络环境,尤其擅长高并发访问 * 轻量体现在node本身既是代码,又是服务器,前后端使用统一语言 * 可扩展体现在可以轻松应对多实例,多服务器架构,同时有海量的第三方应用组件 **缺点** * 不适合CPU密集型应用 * CPU密集型应用给Node带来的挑战主要是:由于JavaScript单线程的原因,如果有长时间运行的计算(比如大循环),将会导致CPU时间片不能释放,使得后续I/O无法发起; * 解决方案:分解大型运算任务为多个小任务,使得运算能够适时释放,不阻塞I/O调用的发起; * 只支持单核CPU,不能充分利用CPU * 解决方案:多服务 * 可靠性低,一旦代码某个环节崩溃,整个系统都崩溃 * 原因:单进程 * 解决方案: * (1)Nnigx反向代理,负载均衡,开多个进程,绑定多个端口; * (2)开多个进程监听同一个端口,使用cluster模块; * 开源组件库质量参差不齐,更新快,向下不兼容 ### Koa ? * 就是一种简单好用的 Web 框架。它的特点是优雅、简洁、表达力强、自由度高。本身代码只有1000多行,所有功能都通过插件实现,很符合 Unix 哲学。 * Koa 2.0 与 Koa 1.x 版本的最大区别就是使用了 ES7 中 Async/Await 的特性,代替了 co 的 Generator Function,好处是摆脱了 co 的“暧昧”实现方法,改而使用原生的 Coroutine-like(maybe) 语法。缺点是与从 connect/express 迁移到 Koa 1.x 一样,很弱的向前兼容,需要用一个 wrapper 来继续使用 1.x 的中间件 * 在于 handler 的处理方法,express 是普通的回调函数, koa 是利用ES7 中 Async/Await 的特性,没有回调,没有回调,就大大加速了开发速度这一点而言,已经足以让我们跪舔了 * koa是中间件模式,执行到next的时候,会去调用下一个中间件,下个中间件执行完再接着执行上个中间件next下面的代码 * koa把 request, response 封装到了同一个上下文对象 content ### 什么是RESTful架构? * 每一个URI代表一种资源 * 客户端和服务器之间,传递这种资源的某种表现层 * 客户端通过四个HTTP动词,对服务器端资源进行操作,实现"表现层状态转化" ### 什么是错误优先的回调函数? 错误优先的回调函数(Error-First Callback)用于同时返回错误和数据。第一个参数返回错误,并且验证它是否出错;其他参数用于返回数据。 ```jsx fs.readFile(filePath, function(err, data) { if (err) { // 处理错误 return console.log(err); } console.log(data); }); ``` 如何避免回调地狱? * 模块化: 将回调函数转换为独立的函数 * 使用流程控制库,例如[async](https://link.juejin.im/?target=https%3A%2F%2Fwww.npmjs.com%2Fpackage%2Fasync) * 使用Promise * 使用async/await(参考[Async/Await替代Promise的6个理由](https://link.juejin.im/?target=https%3A%2F%2Fblog.fundebug.com%2F2017%2F04%2F04%2Fnodejs-async-await%2F)) ### 如何让node监听80端口? * 借助 nginx * sudo ### 一次完整的HTTP请求所经历的7个步骤? HTTP通信机制是在一次完整的HTTP通信过程中,Web浏览器与Web服务器之间将完成下列7个步骤: **建立TCP连接 ** * 在HTTP工作开始之前,Web浏览器首先要通过网络与Web服务器建立连接,该连接是通过TCP来完成的,该协议与IP协议共同构建Internet,即著名的TCP/IP协议族,因此Internet又被称作是TCP/IP网络。HTTP是比TCP更高层次的应用层协议,根据规则,只有低层协议建立之后才能进行更高层协议的连接,因此,首先要建立TCP连接,一般TCP连接的端口号是80。 **Web浏览器向Web服务器发送请求命令** * 一旦建立了TCP连接,Web浏览器就会向Web服务器发送请求命令。例如:GET/sample/hello.jsp HTTP/1.1。 **Web浏览器发送请求头信息** * 浏览器发送其请求命令之后,还要以头信息的形式向Web服务器发送一些别的信息,之后浏览器发送了一空白行来通知服务器,它已经结束了该头信息的发送。 **Web服务器应答** * 客户机向服务器发出请求后,服务器会客户机回送应答, HTTP/1.1 200 OK ,应答的第一部分是协议的版本号和应答状态码。 **Web服务器发送应答头信息** * 正如客户端会随同请求发送关于自身的信息一样,服务器也会随同应答向用户发送关于它自己的数据及被请求的文档。 **Web服务器向浏览器发送数据** * Web服务器向浏览器发送头信息后,它会发送一个空白行来表示头信息的发送到此为结束,接着,它就以Content-Type应答头信息所描述的格式发送用户所请求的实际数据。 **Web服务器关闭TCP连接** 一般情况下,一旦Web服务器向浏览器发送了请求数据,它就要关闭TCP连接,然后如果浏览器或者服务器在其头信息加入了这行代码:Connection:keep-alive * TCP连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了网络带宽。 ### [什么是HTTP,TCP,UDP?](https://www.cnblogs.com/xiohao/p/4439164.html) **关系** TCP/IP是个协议组,可分为四个层次:网络接口层、网络层、传输层和应用层。 在网络层有IP协议、ICMP协议、ARP协议、RARP协议和BOOTP协议。 在传输层中有TCP协议与UDP协议。 在应用层有HTTP,FTP、TELNET、SMTP、DNS等协议。 **HTTPS通信原理** HTTPS(Secure Hypertext Transfer Protocol)安全超文本传输协议 它是一个安全通信通道 HTTPS是HTTP over SSL/TLS,HTTP是应用层协议,TCP是传输层协议,在应用层和传输层之间,增加了一个安全套接层SSL/TLS: * SSL (Secure Socket Layer,安全套接字层) * TLS (Transport Layer Security,传输层安全协议) * SSL使用40 位关键字作为RC4流加密算法 (加密的是path/body) **Https的作用** * 内容加密 建立一个信息安全通道,来保证数据传输的安全; * 身份认证 确认网站的真实性 * 数据完整性 防止内容被第三方冒充或者篡改 HTTP(HyperText Transfer Protocal, 超文本传输协议)无状态、HTTP连接最显著的特点是客户端发送的每次请求都需要服务器回送响应,在请求结束后,会主动释放连接。从建立连接到关闭连接的过程称为“一次连接”。 TCP(Transmission Control Protocol,传输控制协议)是基于连接的协议,也就是说,在正式收发数据前,必须和对方建立可靠的连接。一个TCP连接必须要经过三次“对话”才能建立起来,其中的过程非常复杂,我们这里只做简单、形象的介绍,你只要做到能够理解这个过程即可。我们来看看这三次对话的简单过程:主机A向主机B发出连接请求数据包:“我想给你发数据,可以吗?”,这是第一次对话;主机B向主机A发送同意连接和要求同步(同步就是两台主机一个在发送,一个在接收,协调工作)的数据包:“可以,你什么时候发?”,这是第二次对话;主机A再发出一个数据包确认主机B的要求同步:“我现在就发,你接着吧!”,这是第三次对话。三次“对话”的目的是使数据包的发送和接收同步,经过三次“对话”之后,主机A才向主机B正式发送数据。 UDP(User Data Protocol,用户数据报协议)是与TCP相对应的协议。它是面向非连接的协议,它不与对方建立连接,而是直接就把数据包发送过去! UDP适用于一次只传送少量数据、对可靠性要求不高的应用环境。比如,我们经常使用“ping”命令来测试两台主机之间TCP/IP通信是否正常,其实“ping”命令的原理就是向对方主机发送UDP数据包,然后对方主机确认收到数据包,如果数据包是否到达的消息及时反馈回来,那么网络就是通的。例如,在默认状态下,一次“ping”操作发送4个数据包(如图2所示)。大家可以看到,发送的数据包数量是4包,收到的也是4包(因为对方主机收到后会发回一个确认收到的数据包)。这充分说明了UDP协议是面向非连接的协议,没有建立连接的过程。正因为UDP协议没有连接的过程,所以它的通信效果高;但也正因为如此,它的可靠性不如TCP协议高。QQ就使用UDP发消息,因此有时会出现收不到消息的情况。 tcp协议和udp协议的差别 差别 | TCP | UDP ---- | ----- | ----- | ----- 是否连接 | 面向连接 | 面向非连接 传输可靠性 | 可靠 | 不可靠 应用场合 | 传输大量数据 | 少量数据 速度 | 慢 | 快 ### Node的中间件模式? **中间件** 在 Node.js 中被广泛使用,它泛指一种特定的设计模式、一系列的处理单元、过滤器和处理程序。以函数的形式存在,连接在一起,形成一个异步队列,来完成对任何数据的预处理和后处理。 横向处理 **灵活性**:使用中间件我们用极少的操作就能得到一个插件 **扩展性:**用最简单的方法就能将新的过滤器和处理程序扩展到现有的系统上 * koa-bodyparser ** 用来解析body的中间件,ctx.request中可以获取到对象形式的数据 ** xml数据没办法通过koa-bodyparse解析,有另一个中间件koa-xml-body * koa-logger * 用来打印一些请求日志 * koa2-cors * 允许跨域请求 * koa-jwt * 校验token * koa-router * 配置路由 * crypto * 加密数据(用户密码) * **对称加密(Symmetric Cryptography)** * 对称加密是最快速、最简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥(secret key)。对称加密有很多种算法,由于它效率很高,所以被广泛使用在很多加密协议的核心当中 * 选择了Rijndael算法 * **非对称加密(Asymmetric Cryptography)** * 非对称加密为数据的加密与解密提供了一个非常安全的方法,它使用了一对密钥,公钥(public key)和私钥(private key)。私钥只能由一方安全保管,不能外泄,而公钥则可以发给任何请求它的人。非对称加密使用这对密钥中的一个进行加密,而解密则需要另一个密钥。比如,你向银行请求公钥,银行将公钥发给你,你使用公钥对消息加密,那么只有私钥的持有人--银行才能对你的消息解密。与对称加密不同的是,银行不需要将私钥通过网络发送出去,因此安全性大大提高 * 目前最常用的非对称加密算法是RSA算法 ### Promise的用法? **状态?** * pending (正在处理) * reslove(正确返回) * reject(错误返回) **方法?** * Promise.all([PromiseA, PromiseB]).then((resultA, resultB)=> {}) * 需等待多个异步方法成功相应 * Promise.race([PromiseA, PromiseB]),then(resultA => {}) * 按结束时间只选择最快的结果 ### async/await? 使用 async / await, 搭配 promise, 可以通过编写形似同步的代码来处理异步流程, 提高代码的简洁性和可读性. ### 匿名函数、闭包? **匿名函数** * 通过表达式的自我执行 ```jsx // 自我执行 (function (num){ alert(num); })(100); ``` **闭包** * 闭包指有权访问另一个函数作用域里变量的函数 * 使用闭包的优点(缺点),可以把局部变量驻留在内存中,避免使用全局变量(全局变量污染导致应用程序不可预测性,每个模块都可调用容易发生错误,所以推荐使用私有的,封装的局部变量) ```jsx //函数里放一个匿名函数---闭包 function box (){ return function(){ return 'Lee'; } } alert(box); //function box(){return function(){return 'Lee'}} alert(box());//function (){return 'Lee'} alert(box()());//Lee ``` ### 关于this指向 this对象是在运行时基于函数的执行环境绑定的,如果this在全局范围就是window,如果是在对象内部,就指向这个对象,而闭包却是在运行时指向window的,因而闭包不属于这个对象的属性或方法。 ### MongoDB的优缺点? **优点** * 高性能 * 高可用性 * 易扩展性 * 丰富的查询语言,支持动态查询以及查询记录分析 * 面向文档存储(BSON,类JSON数据模式简单而强大) * 查询与索引方式灵活,是最像SQL的Nosql * 全索引支持,扩展到内部对象和内嵌数组 * 高效存储二进制大对象 (比如照片和视频) * 复制和故障切换支持 * Auto- Sharding自动分片支持云级扩展性 * MapReduce 支持复杂聚合 **缺点** * 不支持事务(进行开发时需要注意,哪些功能需要使用数据库提供的事务支持) * MongoDB占用空间过大 (不过这个确定对于目前快速下跌的硬盘价格来说,也不算什么缺点了) * MongoDB没有如MySQL那样成熟的维护工具,这对于开发和IT运营都是个值得注意的地方 * 在32位系统上,不支持大于2.5G的数据(很多操作系统都已经抛弃了32位版本,所以这个也算不上什么缺点了,3.4版本已经放弃支持32 位 x86平台) * 大数据量持续插入,写入性能有较大波动 * 单机可靠性比较差 * 在集群分片中的数据分布不均匀 ### MongoDB支持存储过程吗?如果支持的话,怎么用? * MongoDB支持存储过程,它是javascript写的,保存在db.system.js表中 ### 关系型数据库与非关系型数据库的区别? * NoSQL是非关系型数据库,NoSQL = Not Only SQL。 * 关系型数据库采用的结构化的数据,NoSQL采用的是键值对的方式存储数据。 * 在处理非结构化/半结构化的大数据时;在水平方向上进行扩展时; * 随时应对动态增加的数据项时可以优先考虑使用NoSQL数据库。 * 在考虑数据库的成熟度;支持;分析和商业智能;管理及专业性等问题时,应优先考虑关系型数据库。 ### 条件查询符? * $gt ---- > (greater than) * $lt ---- < (less than) * $gte ---- >= (greater than equal) * $lte ---- <= (less than equal) * $ne ---- != 、<> (not equal) * $in ---- in * $nin ---- not in * $all ---- all * $or ---- or * $not ---- 反匹配 ### 为什么MongoDB的数据文件很大? * MongoDB采用的预分配空间的方式来防止文件碎片。 ### 当更新一个正在被迁移的块(Chunk)上的文档时会发生什么? * 更新操作会立即发生在旧的块(Chunk)上,然后更改才会在所有权转移前复制到新的分片上。 ### MongoDB在A:{B,C}上建立索引,查询A:{B,C}和A:{C,B}都会使用索引吗? * 不会,只会在A:{B,C}上使用索引。 ### 如果一个分片(Shard)停止或很慢的时候,发起一个查询会怎样? * 如果一个分片停止了,除非查询设置了“Partial”选项,否则查询会返回一个错误。如果一个分片响应很慢,MongoDB会等待它的响应。 ### Redis **简介** Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。 Redis 与其他 key - value 缓存产品有以下三个特点: * Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。 * Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。 * Redis支持数据的备份,即master-slave模式的数据备份。 **Redis 优势** * 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。 * 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。 * 原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。 * 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。 **Redis与其他key-value存储有什么不同?** * Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径。Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。 * Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,因为数据量不能大于硬件内存。在内存数据库方面的另一个优点是,相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,这样Redis可以做很多内部复杂性很强的事情。同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,因为他们并不需要进行随机访问。 ### 如何优化并发? * node * 异步非阻塞 * redis * 开多个线程 * 对数据库操作 * 加索引 * 线程池 * 拆表 ### 进程的管理工具? pm2、supervisor、nodemon ### 数据库都有哪些? * 关系型数据库 * mysql 、SQL Server、Oracle、Sybase、DB2 * 非关系型数据库 * mongoDB、Redis ### [什么是事件循环?](http://www.cnblogs.com/onepixel/p/7143769.html) ### [查找算法?](https://blog.csdn.net/weixin_39241397/article/details/79344179) ### [排序算法?](https://blog.csdn.net/hanxiaoran906/article/details/81488232) ### [JS经典面试题?](https://juejin.im/post/5bd95d22e51d45685f442f73#heading-5) ### [MYSQL的事务隔离?](https://www.cnblogs.com/huanongying/p/7021555.html) ### [async/await/yield?](https://www.cnblogs.com/jiasm/p/8999111.html) ### [Mysql及Mongodb?](https://my.oschina.net/u/3728166/blog/2875720) ### [JS的对象,原型,继承?](https://blog.csdn.net/zlxadhkust/article/details/24594783) ### [消息队列的使用场景?](https://www.cnblogs.com/ruiati/p/6649868.html) ### [Promise是怎么实现的?](https://www.jianshu.com/p/8d3bd325e886) ### [引擎?](https://baike.baidu.com/item/innodb/8970025?fr=aladdin) ### [数据库表的设计规范?](http://www.cnblogs.com/knowledgesea/p/3667395.html) ### [并行与并发?](https://blog.csdn.net/a1455990364/article/details/78678302) ### [SQL语法?](http://www.w3school.com.cn/sql/sql_select.asp) 9人点赞 [技术](/nb/4142966) **转载:** 作者:Luciena 链接:https://www.jianshu.com/p/078184c0c3cc 来源:简书
评论
表情
发送
0
评论