写点什么

【Node 专题】Buffer 理解

用户头像
南吕
关注
发布于: 2021 年 04 月 27 日

闲言碎语

Buffer 对象,是 Node 的核心模块,在面试中也是会频繁被问到一个考题,如果没有对其深入探究,可能就跟我一样只会用,一旦面试官扩展问些问题可能就不会了。反正,当时我也只能回答说:目前涉及到的业务对 Buffer 模块用的比较少,但是 Buffer 对象可以对于一些字符串传输无法满足业务功能和性能上得到有效的优化。

所以,今天学习一下 Buffer 对象。

Buffer 对象

Buffer 对象用于表示固定长度的字节序列

// 创建一个长度为 10、以零填充的 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 的数值)

对 Buffer 某个元素赋值如果小于 0 的,会逐次加 256,直到得到一个 0 到 255 范围的值,如果大于 255 则逐次减 256,直到得到 0-255 范围得值,如果是小数的话,则直接取整。

使用场景

  • 可用于处理大量二进制数据

  • 处理图片、文件接收上传、网络协议等等

优势

网络传输中,性能提升

大部分网络传输的时候会使用通过使用字符串,这难免需要转换成 Buffer,以二进制方式进行数据传输。如果我们直接预先转换为 Buffer 再进行传输,那么在传输过程中无需做额外的转换,也避免了损耗,使性能得到提升。

以下通过 ab 进行一次性能测试,发起 200 个并发客户端请求的结果,QPS 提升的不是很高,但还是有一点点的提升,可以复制代码执行下,是否结果和我一样




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

场景:

文件分片上传下载,比如下载电影时可以边下载边看,这样一个实现过程。

发布于: 2021 年 04 月 27 日阅读数: 10
用户头像

南吕

关注

你我皆凡人 2019.05.10 加入

hi,Jasen

评论

发布
暂无评论
【Node专题】Buffer理解