Node.js快取
Node.js Buffer(緩衝區)
JavaScript 語言自身只有字串資料型別,沒有二進位制資料型別。
但在處理像TCP流或檔案流時,必須使用到二進位制資料。因此在 Node.js中,定義了一個 Buffer 類,該類用來建立一個專門存放二進位制資料的快取區。
在 Node.js 中,Buffer 類是隨 Node 核心一起釋出的核心庫。Buffer 庫為 Node.js 帶來了一種儲存原始資料的方法,可以讓 Node.js 處理二進位制資料,每當需要在 Node.js 中處理I/O操作中移動的資料時,就有可能使用 Buffer 庫。原始資料儲存在 Buffer 類的例項中。一個 Buffer 類似於一個整數陣列,但它對應於 V8 堆記憶體之外的一塊原始記憶體。
Buffer 與字元編碼
Buffer 例項一般用於表示編碼字元的序列,比如 UTF-8 、 UCS2 、 Base64 、或十六進位制編碼的資料。 通過使用顯式的字元編碼,就可以在 Buffer 例項與普通的 JavaScript 字串之間進行相互轉換。
const buf = Buffer.from(`runoob`, `ascii`); // 輸出 72756e6f6f62 console.log(buf.toString(`hex`)); // 輸出 cnVub29i console.log(buf.toString(`base64`));
Node.js 目前支援的字元編碼包括:
-
ascii – 僅支援 7 位 ASCII 資料。如果設定去掉高位的話,這種編碼是非常快的。
-
utf8 – 多位元組編碼的 Unicode 字元。許多網頁和其他文件格式都使用 UTF-8 。
-
utf16le – 2 或 4 個位元組,小位元組序編碼的 Unicode 字元。支援代理對(U+10000 至 U+10FFFF)。
-
ucs2 – utf16le 的別名。
-
base64 – Base64 編碼。
-
latin1 – 一種把 Buffer 編碼成一位元組編碼的字串的方式。
-
binary – latin1 的別名。
-
hex – 將每個位元組編碼為兩個十六進位制字元。
將 Buffer 轉換為 JSON 物件
語法
將 Node Buffer 轉換為 JSON 物件的函式語法格式如下:
buf.toJSON()
當字串化一個 Buffer 例項時,JSON.stringify() 會隱式地呼叫該 toJSON()。
返回值
返回 JSON 物件。
例項
const buf = Buffer.from([0x1, 0x2, 0x3, 0x4, 0x5]); const json = JSON.stringify(buf); // 輸出: {"type":"Buffer","data":[1,2,3,4,5]} console.log(json); const copy = JSON.parse(json, (key, value) => { return value && value.type === `Buffer` ? Buffer.from(value.data) : value; }); // 輸出: <Buffer 01 02 03 04 05> console.log(copy);
執行以上程式碼,輸出結果為:
{"type":"Buffer","data":[1,2,3,4,5]} <Buffer 01 02 03 04 05>
緩衝區裁剪
Node 緩衝區裁剪語法如下所示:
buf.slice([start[, end]])
引數
引數描述如下:
-
start – 數字, 可選, 預設: 0
-
end – 數字, 可選, 預設: buffer.length
返回值
返回一個新的緩衝區,它和舊緩衝區指向同一塊記憶體,但是從索引 start 到 end 的位置剪下。
例項
var buffer1 = Buffer.from(`runoob`); // 剪下緩衝區 var buffer2 = buffer1.slice(0,2); console.log("buffer2 content: " + buffer2.toString());
執行以上程式碼,輸出結果為:
buffer2 content: ru
裁剪功能返回的實際是原始快取區 buffer 或者一部分,操作的是與原始 buffer 同一塊記憶體區域。
// 裁剪 var buffer_origin = Buffer.from(`runoob`); var buffer_slice = buffer_origin.slice(0,2); console.log("buffer slice content: "+buffer_slice.toString()); console.log("buffer origin content: "+buffer_origin.toString()); buffer_slice.write("wirte"); // Write buffer slice // 裁剪前與原始字串的改變 console.log("buffer slice content: "+buffer_slice.toString()); console.log("buffer origin content: "+buffer_origin.toString());
輸出:
buffer slice content: ru buffer origin content: runoob buffer slice content: wi buffer origin content: winoob
可以看到對裁剪返回的 buffer 進行寫操作同時,也對原始 buffer 進行了寫操作。
摘自:http://www.runoob.com/nodejs/nodejs-buffer.html
相關文章
- 快取穿透、快取擊穿、快取雪崩、快取預熱快取穿透
- 快取穿透、快取擊穿、快取雪崩快取穿透
- 快取穿透、快取雪崩、快取擊穿快取穿透
- Redis快取擊穿、快取穿透、快取雪崩Redis快取穿透
- HTTP快取——協商快取(快取驗證)HTTP快取
- [Redis]快取穿透/快取擊穿/快取雪崩Redis快取穿透
- 快取穿透 快取雪崩快取穿透
- 快取問題(一) 快取穿透、快取雪崩、快取併發 核心概念快取穿透
- 快取穿透、快取擊穿、快取雪崩區別快取穿透
- 新技能:通過程式碼快取加速 Node.js 的啟動快取Node.js
- 新技能:透過程式碼快取加速 Node.js 的啟動快取Node.js
- 快取問題(四) 快取穿透、快取雪崩、快取併發 解決案例快取穿透
- ServiceWorker 快取與 HTTP 快取快取HTTP
- mybatis快取-二級快取MyBatis快取
- MyBatis快取機制(一級快取,二級快取)MyBatis快取
- 快取、快取演算法和快取框架簡介快取演算法框架
- 快取淘汰、快取穿透、快取擊穿、快取雪崩、資料庫快取雙寫一致性快取穿透資料庫
- Redis詳解(十二)------ 快取穿透、快取擊穿、快取雪崩Redis快取穿透
- 面試總結 —— Redis “快取穿透”、“快取擊穿”、“快取雪崩”面試Redis快取穿透
- 快取穿透,快取擊穿,快取雪崩解決方案分析快取穿透
- 快取穿透、快取雪崩和快取擊穿是什麼?快取穿透
- Redis——快取穿透、快取擊穿、快取雪崩、分散式鎖Redis快取穿透分散式
- Redis快取穿透、快取雪崩、快取擊穿好好說說Redis快取穿透
- 分散式快取 - 快取簡介,常用快取演算法分散式快取演算法
- 什麼是redis快取雪崩、快取穿透、快取擊穿Redis快取穿透
- Web快取 – HTTP協議快取Web快取HTTP協議
- 快取工廠之Redis快取快取Redis
- 快取最佳化(快取穿透)快取穿透
- 如何設計快取系統:快取穿透,快取擊穿,快取雪崩解決方案分析快取穿透
- 快取快取
- flutter 獲取應用快取以及清除快取Flutter快取
- 快取專題:HTML5離線快取與HTTP快取快取HTMLHTTP
- http快取策略以及強快取和協商快取淺析HTTP快取
- 快取穿透、快取擊穿、快取雪崩概念及解決方案快取穿透
- REDIS快取穿透,快取擊穿,快取雪崩原因+解決方案Redis快取穿透
- Redis的快取穿透、快取雪崩、快取擊穿的區別Redis快取穿透
- 【Redis】快取穿透,快取擊穿,快取雪崩及解決方案Redis快取穿透
- 快取穿透、快取擊穿、快取雪崩區別和解決方案快取穿透