【Node專題】Buffer的理解

閒言碎語

Buffer對象,是Node的核心模塊,在面試中也是會頻繁被問到一個考題,若是沒有對其深刻探究,可能就跟我同樣只會用,一旦面試官擴展問些問題可能就不會了。反正,當時我也只能回答說:目前涉及到的業務對Buffer模塊用的比較少,可是Buffer對象能夠對於一些字符串傳輸沒法知足業務功能和性能上獲得有效的優化。javascript

因此,今天學習一下Buffer對象。java

Buffer對象

Buffer對象用於表示固定長度的字節序列面試

// 建立一個長度爲 十、以零填充的 Buffer。
const buf1 = Buffer.alloc(10);

// 建立一個長度爲 10 的 Buffer,
// 其中所有填充了值爲 `1` 的字節。
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>
複製代碼

觀察輸出的結果,Buffer對象相似一個數組。數組

Buffer對象中的每一個元素都是16進制的兩位數(即0到255的數值)markdown

對Buffer某個元素賦值若是小於0的,會逐次加256,直到獲得一個0到255範圍的值,若是大於255則逐次減256,直到獲得0-255範圍得值,若是是小數的話,則直接取整。網絡

使用場景

  • 可用於處理大量二進制數據
  • 處理圖片、文件接收上傳、網絡協議等等

優點

網絡傳輸中,性能提高

大部分網絡傳輸的時候會使用經過使用字符串,這不免須要轉換成Buffer,以二進制方式進行數據傳輸。若是咱們直接預先轉換爲Buffer 再進行傳輸,那麼在傳輸過程當中無需作額外的轉換,也避免了損耗,使性能獲得提高。併發

如下經過ab進行一次性能測試,發起200個併發客戶端請求的結果,QPS提高的不是很高,但仍是有一點點的提高,能夠複製代碼執行下,是否結果和我同樣性能

image-20210426225513303.png

image-20210426225618070.png

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的核心模塊,數據就像流水同樣,流是對輸入輸出設備的抽象,是一組有序的、有起點和終點的字節數據傳輸手段。學習

Node.js 中有四種基本的流類型:測試

  • Writable - 可寫入數據的流(例如 fs.createWriteStream())
  • Readable - 可讀取數據的流(例如 fs.createReadStream())。
  • Duplex - 可讀又可寫的流(例如 net.Socket)。
  • Transform - 在讀寫過程當中能夠修改或轉換數據的 Duplex

場景:

文件分片上傳下載,好比下載電影時能夠邊下載邊看,這樣一個實現過程。

相關文章
相關標籤/搜索