本篇文章給大家介紹一下node.js中的Buffer對象,看看Buffer對象的使用場景是什么,有哪些優(yōu)勢。
Buffer對象,是Node的核心模塊,在面試中也是會頻繁被問到一個考題,如果沒有對其深入探究,可能就跟我一樣只會用,一旦面試官擴展問些問題可能就不會了。反正,當時我也只能回答說:目前涉及到的業(yè)務(wù)對Buffer模塊用的比較少,但是Buffer對象可以對于一些字符串傳輸無法滿足業(yè)務(wù)功能和性能上得到有效的優(yōu)化?!就扑]學習:《nodejs 教程》】
所以,今天學習一下Buffer對象。
Buffer對象
Buffer對象用于表示固定長度的字節(jié)序列
// 創(chuàng)建一個長度為 10、以零填充的 Buffer。 const buf1 = Buffer.alloc(10); // 創(chuàng)建一個長度為 10 的 Buffer, // 其中全部填充了值為 `1` 的字節(jié)。 const buf2 = Buffer.alloc(10, 1); var str="hello Jasen"; var buf = new Buffer.from(str,'utf-8'); console.log(buf); //輸出:<Buffer 68 65 6c 6c 6f 20 4a 61 73 65 6e>
觀察輸出的結(jié)果,Buffer對象類似一個數(shù)組。
Buffer對象中的每個元素都是16進制的兩位數(shù)(即0到255的數(shù)值)
對Buffer某個元素賦值如果小于0的,會逐次加256,直到得到一個0到255范圍的值,如果大于255則逐次減256,直到得到0-255范圍得值,如果是小數(shù)的話,則直接取整。
使用場景
- 可用于處理大量二進制數(shù)據(jù)
- 處理圖片、文件接收上傳、網(wǎng)絡(luò)協(xié)議等等
優(yōu)勢
網(wǎng)絡(luò)傳輸中,性能提升
大部分網(wǎng)絡(luò)傳輸?shù)臅r候會使用通過使用字符串,這難免需要轉(zhuǎn)換成Buffer,以二進制方式進行數(shù)據(jù)傳輸。如果我們直接預(yù)先轉(zhuǎn)換為Buffer 再進行傳輸,那么在傳輸過程中無需做額外的轉(zhuǎn)換,也避免了損耗,使性能得到提升。
以下通過ab進行一次性能測試,發(fā)起200個并發(fā)客戶端請求的結(jié)果,QPS提升的不是很高,但還是有一點點的提升,可以復(fù)制代碼執(zhí)行下,是否結(jié)果和我一樣
var http = require('http'); var str = ""; for (var i = 0; i < 1024 * 10; i++) { str += "a"; } str = new Buffer.from(str,'utf-8'); http.createServer(function (req, res) { res.writeHead(200); res.end(bufstr); }).listen(8002);
Buffer與Stream
Stream 也是Node的核心模塊,數(shù)據(jù)就像流水一樣,流是對輸入輸出設(shè)備的抽象,是一組有序的、有起點和終點的字節(jié)數(shù)據(jù)傳輸手段。
Node.js 中有四種基本的流類型:
- Writable – 可寫入數(shù)據(jù)的流(例如 fs.createWriteStream())
- Readable – 可讀取數(shù)據(jù)的流(例如 fs.createReadStream())。
- Duplex – 可讀又可寫的流(例如 net.Socket)。
- Transform – 在讀寫過程中可以修改或轉(zhuǎn)換數(shù)據(jù)的
Duplex
流
場景:
文件分片上傳下載,比如下載電影時可以邊下載邊看,這樣一個實現(xiàn)過程。
原文地址:https://juejin.cn/post/6955490895131066382