Hướng dẫn này nói về Bộ đệm trong Nodejs. Hãy nhớ rằng chúng tôi đã nói về các luồng? . Đi trước và đọc chúng. Phần 1 và Phần 2
Và nếu bạn đã hiểu Luồng là gì, thì bạn đã sẵn sàng, mi amigo
Quay lại vấn đề chính, để hiểu bộ đệm trong Nodejs là gì, trước tiên bạn cần hiểu luồng là gì
Tương quan các luồng với bộ đệm trong Nodejs
Giả sử bạn hiểu những gì tôi đang nói vào thời điểm này, bộ đệm trong Nodejs đề cập đến dữ liệu tạm thời mà một luồng lưu giữ trước khi nó được sử dụng
Kích thước của bộ đệm trong luồng được xác định bởi một thuộc tính trên phiên bản luồng được gọi là highWatermark. Thuộc tính này là một số xác định kích thước của bộ đệm theo byte
Theo hành vi mặc định, bộ nhớ đệm hoạt động trên Bộ đệm và Chuỗi. Chúng tôi cũng có thể chọn để nó hoạt động trên các đối tượng JavaScript. Trong trường hợp đó, chúng ta phải đặt thuộc tính objectMode trên luồng thành true
Bây giờ, khi một số dữ liệu được đẩy vào luồng, dữ liệu đó sẽ nằm trong bộ đệm luồng cho đến khi luồng được sử dụng hết. Khi bộ nhớ đệm đầy và chúng tôi cố gắng đẩy mạnh dữ liệu vào luồng, dữ liệu sẽ bị từ chối và kết quả trả về là sai đối với hành động đẩy
Bộ đệm trong Nodejs – Định nghĩa độc lập
Lớp đệm có sẵn trong phạm vi toàn cầu trong Nodejs và do đó, bạn không bao giờ phải nhập nó bằng mô-đun yêu cầu
Có thể nói, bộ đệm trong Nodejs ít phổ biến hoặc quen thuộc hơn đối với các nhà phát triển Node vì họ không tương tác với bộ nhớ hệ thống hàng ngày
Các nhà phát triển làm việc với Go, C hoặc C++ hoặc bất kỳ ngôn ngữ lập trình hệ thống nào khác đều quen thuộc với khái niệm Bộ đệm
Bộ đệm trong Nodejs là một kích thước bộ nhớ cố định không thể thay đổi kích thước. Như đã đề cập ở trên, kích thước của chúng được xác định bởi thuộc tính highWatermark trên phiên bản luồng
Chúng ta có thể nghĩ về Bộ đệm trong Nodejs như một mảng các số nguyên, mỗi số xác định kích thước của bộ nhớ theo byte dữ liệu. Bộ đệm được đặt bên ngoài công cụ JavaScript V8
Tại sao sử dụng bộ đệm trong Nodejs lại hữu ích?
Bộ đệm trong nút. js không nên nhầm lẫn với khái niệm về bộ đệm. Đây chỉ là trường hợp khi bộ xử lý luồng nhận dữ liệu với tốc độ nhanh hơn mức nó có thể tiêu hóa
Bộ đệm trong Nodejs là JavaScript thuần túy. Mặc dù chúng hoạt động rất tốt với các chuỗi được mã hóa bằng Unicode, nhưng chúng không hoạt động tốt với dữ liệu nhị phân. Tuy nhiên, đối với trình duyệt thì không sao, vì hầu hết dữ liệu đều là chuỗi
Ban đầu, Nodejs sử dụng các chuỗi để xử lý các luồng TCP và đọc và ghi vào hệ thống tệp. Tuy nhiên, có một vấn đề với chuỗi. Cả hai nhiệm vụ này đều yêu cầu xử lý các luồng dữ liệu nhị phân
Mặc dù bạn có thể sử dụng dây, tuy nhiên, điều đó sẽ chỉ mang lại rắc rối cho bạn. Đầu tiên, cách tiếp cận này làm chậm quá trình vì bạn sẽ phải sử dụng API tương thích với chuỗi chứ KHÔNG phải dữ liệu nhị phân
Thứ hai, mã cũng có xu hướng bị hỏng theo những cách không mong muốn
Vì vậy, tại sao lại sử dụng chuỗi nhị phân, khi bạn có thể sử dụng bộ đệm trong Nodejs
Tạo bộ đệm trong Nodejs
Bộ đệm trong Nodejs có thể được tạo bằng Bộ đệm. từ [], Bộ đệm. cấp phát [] và Bộ đệm. phương thức allocUnsafe[]
const buf = Bộ đệm. from['Một số văn bản ngớ ngẩn. ’];
Bạn thậm chí có thể sử dụng cú pháp sau để tạo bộ đệm trong Nodejs
- Đệm. từ [mảng]
- Đệm. from[arrayBuffer[, byteOffset[, length]]]
- Đệm. từ [bộ đệm]
- Đệm. từ [chuỗi [, mã hóa]]
Chúng tôi cũng có thể phân bổ kích thước khi khởi tạo bộ đệm. Hãy tạo bộ đệm 2KB
const buf = Bộ đệm. alloc[2048]
//or
const buf = Bộ đệm. allocUnsafe[2048]
Lưu ý quan trọng
Một số điều bạn nên biết khi làm việc với bộ đệm trong Nodejs. Mặc dù cả alloc và allocUnsafe đều xác định kích thước cho Bộ đệm theo byte, nhưng có sự khác biệt giữa hai
Phương thức alloc[] được khởi tạo bằng 0 và phương thức allocUnsafe[] vẫn chưa được khởi tạo. Có nghĩa là, mặc dù allocUnsafe[] có thể tương đối nhanh hơn alloc[], nhưng phần dữ liệu được phân bổ có thể chứa dữ liệu cũ và có khả năng nhạy cảm
Nếu có dữ liệu cũ hơn trong bộ nhớ, có thể bị truy cập hoặc rò rỉ khi Bộ đệm được đọc. Đây chính xác là lý do tại sao nó được đặt tên là allocUnsafe và đây là điều khiến nó không an toàn
Bạn nên cẩn thận hơn khi sử dụng phương pháp này
Truy cập nội dung của bộ đệm
Trước đó trong bài viết này, tôi đã đề cập đến Bộ đệm trong Nodejs giống một mảng byte hơn. Do đó, khi chúng ta truy cập dữ liệu từ một mảng đơn giản, chúng ta có thể thực hiện tương tự ở đây để truy cập nội dung của bộ đệm bằng cách sử dụng chỉ mục
const buf = Bộ đệm. từ ['Này. ']
bảng điều khiển. log[buf[0]] //72
bảng điều khiển. log[buf[1]] //101
bảng điều khiển. log[buf[2]] //121
Các số bạn nhìn thấy là các byte UTF-8 xác định các ký tự trong bộ đệm đó [H → 72, e → 101, y → 121]. Bạn thấy điều này vì UTF-8 là bảng mã Unicode mặc định. Điều quan trọng cần lưu ý là một số ký tự có thể chiếm nhiều byte bộ nhớ hơn
Để in toàn bộ nội dung của bộ đệm, hãy sử dụng phương thức toString[]
bảng điều khiển. nhật ký [buf. toString[]]
Theo mặc định, buf. toString[] cũng sử dụng mã hóa UTF-8
Khi bạn khởi tạo bộ đệm với một số được chỉ định trước cho kích thước, bạn sẽ không nhận được bộ đệm trống, thay vào đó bạn sẽ tìm thấy một số dữ liệu ngẫu nhiên bên trong nó
Thay đổi nội dung của bộ đệm
Bạn có thể ghi toàn bộ chuỗi dữ liệu vào bộ đệm trong Nodejs bằng cách sử dụng phương thức write[]
const buf = Bộ đệm. cấp phát[4]
buf. viết ['Đan. ']
Giống như chúng ta thay đổi dữ liệu trong một mảng bằng cách truy cập nó lần đầu tiên, chúng ta có thể làm tương tự ở đây để thay đổi nội dung của bộ đệm trong Nodejs
const buf = Bộ đệm. from['dan. ']
buf[2] = 79 // y trong bảng điều khiển UTF-8
. nhật ký [buf. toString[]] //Ngày.
Phần kết luận
Để hiểu bộ đệm trong Nodejs là gì, trước tiên bạn cần hiểu luồng là gì. Đọc bài đăng này về bộ đệm trong Nodejs để giải thích nó là gì, cách thức hoạt động và cách bạn có thể sử dụng bộ đệm trong các dự án Nodejs