/ / Hiểu về bộ đệm trong Node.js

Hiểu về bộ đệm trong Node.js

woman holding nodejs sticker

Bộ đệm là một vị trí cụ thể trong bộ nhớ thô. Nó phục vụ như một không gian lưu trữ tạm thời cho dữ liệu nhị phân dư thừa mà đơn vị xử lý không thể chấp nhận tại thời điểm cụ thể đó.


Node.js bao gồm một lớp Bộ đệm. Nó có thể xử lý dữ liệu nhị phân khi quản lý các luồng TCP (Giao thức điều khiển truyền tải) và các thao tác đọc-ghi trên một hệ thống tệp.

Tìm hiểu cách tạo, đọc và thay đổi nội dung của bộ đệm.


Tạo bộ đệm

Để tạo Bộ đệm trong Node.js, bạn sẽ sử dụng phân bổ() hoặc từ() các phương pháp. Các phân bổ() phương thức tạo một bộ đệm mới, chỉ định kích thước của nó trong quá trình tạo là tham số bắt buộc đầu tiên và duy nhất. Nó hữu ích khi bạn không có bất kỳ dữ liệu nào để lưu trữ tại thời điểm tạo bộ đệm.

Chỉ định tham số kích thước bộ đệm theo byte khi bạn tạo bộ đệm với phân bổ() phương pháp. Ví dụ:

 const buf = Buffer.alloc(8);
console.log(buf);

Lớp Buffer tự động thêm các số 0 làm giá trị giữ chỗ cho dữ liệu mới khi bạn tạo nó bằng phân bổ() phương pháp.

Lớp đệm thể hiện mỗi giá trị 0 là 00, sử dụng định dạng thập lục phân. Trong ví dụ này, nó chứa tổng cộng tám giá trị.

Để khởi tạo Bộ đệm với các giá trị giữ chỗ khác nhau, hãy chuyển giây lấp đầy tham số:

 const buf_filled = Buffer.alloc(8, 5);
console.log(buf_filled);

Đối tượng này trích dẫn một phần trong bộ nhớ lưu trữ 8 byte giá trị 05. Lưu ý rằng mặc dù bạn đã chuyển một số làm lấp đầy tham số, bộ đệm chỉ lưu trữ dữ liệu ở dạng nhị phân.

Sau khi cấp phát bộ nhớ cho Buffer, ghi dữ liệu bằng cách gọi viết() phương pháp:

 const buf = Buffer.alloc(8);

buf.write("v", "utf-8");
console.log(buf)

buf.write("va","utf-8");
console.log(buf)

Các viết() phương pháp sử dụng mã hóa ký tự để chuyển đổi tham số đầu tiên, sử dụng utf-8 và sau đó ghi chuỗi vào Bộ đệm. Thêm ký tự thứ hai vào chuỗi sẽ lấp đầy byte thứ hai.

Để trích xuất dữ liệu từ các kiểu dữ liệu hiện có như chuỗi hoặc mảng, hãy sử dụng từ() phương pháp. Phương pháp này tạo bộ đệm từ chuỗi và mảng.

Ví dụ:

 
const stringBuf = Buffer.from('string')
console.log(stringBuf)


const arrayBuf = Buffer.from([97, 114, 114, 97, 121], 'hex')
console.log(arrayBuf);

Các từ() phương thức lấy đầu vào làm tham số đầu tiên, tính toán số byte cần thiết để mã hóa dữ liệu, sau đó gửi kết quả đến Bộ đệm. Bằng cách cung cấp một định dạng mã hóa khác làm tham số thứ hai, bạn có thể ghi đè mã hóa mặc định (UTF-8).

Truyền số cho từ() phương pháp sẽ dẫn đến một lỗi.

Đọc một bộ đệm

Mặc dù Bộ đệm tương tự như mảng, nhưng chúng không thể thay đổi kích thước và có thể xử lý dữ liệu máy tính nhị phân nhờ các phương thức tích hợp sẵn.

Lớp Buffer cho phép chúng ta đọc từng byte dữ liệu của nó bằng cách sử dụng cú pháp dấu ngoặc vuông của JavaScript.

Ví dụ:

 const myBuf = Buffer.from('Mine');
console.log(MyBuf[1]);

console.log(MyBuf[3]);

console.log(MyBuf[5]);

Khối mã ở trên sử dụng cú pháp dấu ngoặc vuông để lấy các giá trị của byte thứ nhất và byte thứ ba dưới dạng biểu diễn thập phân của chúng. Cố gắng lấy một byte không hợp lệ sẽ dẫn đến lỗi chưa xác định lỗi.

Để truy cập tất cả dữ liệu của nó, lớp Buffer có các phương thức toJSON()toString()lấy nội dung ở hai định dạng khác nhau.

Các toString() phương thức xuất ra một chuỗi dưới dạng nội dung bộ đệm:

 const myBuf = Buffer.from('Mine');
console.log(myBuf.toString());

const numberBuf = Buffer.from([123]);
console.log(numberBuf.toString())

const emptyBuf = Buffer.alloc(5);
console.log(emptyBuf.toString());

Cuộc gọi đầu tiên khởi tạo Bộ đệm với giá trị “Của tôi”, lệnh gọi toString sao chép. Ví dụ thứ hai sử dụng một mảng int đơn để khởi tạo, có biểu diễn chuỗi là “{” tính cách. Trong trường hợp cuối cùng, Bộ đệm có năm giá trị null trả về chuỗi “x00x00x00x00x00”. chuỗi x00 là biểu diễn thập lục phân của null.

Các toString() luôn xuất kết quả ở định dạng chuỗi, bất kể bạn khởi tạo Bộ đệm với loại dữ liệu nào.

Các .toJSON() trả về biểu diễn thập phân của dữ liệu Bộ đệm, bất kể dữ liệu bạn đã sử dụng để khởi tạo Bộ đệm.

Ví dụ:

 const myBuf = Buffer.from('Mine');
console.log(myBuf.toJSON());
// output: { type: 'Buffer', data: [ 77, 105, 110, 101 ] }

Đầu ra JSON có một loại hình tài sản có giá trị Đệm để chỉ nguồn gốc của nó. Thuộc tính dữ liệu của nó lưu trữ một mảng số thập phân đại diện cho mảng byte ban đầu.

Sửa đổi bộ đệm

Tương tự như việc truy cập các byte riêng lẻ của Bộ đệm, bạn cũng có thể sửa đổi các byte riêng lẻ của nội dung Bộ đệm bằng cách sử dụng cú pháp dấu ngoặc vuông.

Khi sử dụng cú pháp dấu ngoặc vuông để thay đổi một nội dung riêng lẻ, bạn chỉ có thể chỉ định biểu diễn thập phân của giá trị.

Ví dụ:

 myBuf[0] = 70
console.log(myBuf.toString())

Vì bộ đệm là dữ liệu nhị phân nên bạn không thể cung cấp một phần cụ thể của bộ đệm thành một chuỗi. Nếu bạn cố gắng đặt một byte riêng lẻ thành một chuỗi, Bộ đệm sẽ dịch nó thành một ký tự null.

Ví dụ:

 myBuf[0] = 'F';
console.log(myBuf.toString());

Ngoài ra, bạn có thể thay đổi toàn bộ nội dung của bộ đệm bằng cách sử dụng viết() phương pháp.

Cân nhắc việc chèn một chỉ mục bên ngoài độ dài của Bộ đệm. Thay vì trả về lỗi, Bộ đệm bỏ qua chỉ mục không hợp lệ và giữ nguyên nội dung Bộ đệm ban đầu.

Ví dụ: cố gắng đặt phần tử thứ năm của myBuf đến r thông qua biểu diễn thập phân của nó 114:

 myBuf[4] = 114;
console.log(myBuf.toString());

Lưu ý rằng toString() phương thức trả về cùng một giá trị ‘Của tôi’.

Vì bạn không thể thay đổi kích thước Bộ đệm, nên việc cố gắng ghi nhiều dữ liệu hơn một bộ đệm có thể giữ sẽ dẫn đến việc nó loại bỏ dữ liệu thừa. Ví dụ:

 const buf1 = Buffer.alloc(5)
buf1.write('number');
console.log(buf1.toString())

Sử dụng toString() để xác nhận dữ liệu bộ đệm, nó sẽ trả về ‘tê’ còn hơn là ‘con số’. Đó là đối số được chèn bên trong viết() phương pháp.

Bộ đệm ghi theo kiểu nối tiếp bắt đầu từ chỉ số không. Các viết() phương thức thêm byte vào Bộ đệm, ghi đè lên bất kỳ dữ liệu nào trước đó.

Ví dụ:

 const buf2 = Buffer.alloc(6);

buf2.write('member');
console.log(buf2.toString())

buf2.write('hi');
console.log(buf2.toString());

Đoạn mã trên tạo bộ đệm sáu byte và thêm chuỗi “thành viên” với nó bằng cách sử dụng viết() phương pháp.

Sau đó, nó cập nhật bộ đệm với nội dung mới chiếm ít dung lượng bộ nhớ hơn nội dung trước đó.

Điều này dẫn đến việc tạo ra một chuỗi mới với hai byte đầu tiên được ghi đè và các byte còn lại không thay đổi.

Nhiều API và cấu trúc dữ liệu sử dụng bộ đệm

Bây giờ bạn đã biết cách tạo bộ đệm, ghi vào một bộ đệm, đọc nội dung của nó và sửa đổi nó bằng các phương pháp thích hợp.

Có một số phương thức khác có sẵn để làm việc với lớp Bộ đệm Node.js.

Bạn nên biết các phương pháp này và hiểu Bộ đệm để nắm bắt cách hoạt động của các khái niệm khác nhau như luồng và hệ thống tệp.

Similar Posts

Leave a Reply

Your email address will not be published. Required fields are marked *