优化方式
- 使用异步I/O:Node.js 本身基于事件驱动和非阻塞I/O模型,应充分利用这一特性。例如在文件读写中,使用
fs.readFile
(异步)而非fs.readFileSync
(同步)。
- 连接池:对于数据库查询,使用连接池来管理数据库连接。以MySQL为例,
mysql2
库提供了连接池功能。这可以避免每次请求都创建新连接的开销,提高复用率。
- 缓存:在适当场景下使用缓存,如
node-cache
。对于频繁读取且不经常变化的数据,先从缓存中获取,减少数据库或文件系统的I/O操作。
- 流操作:在处理大文件读写时,使用流(stream)。如
fs.createReadStream
和fs.createWriteStream
,它逐块处理数据,而非一次性加载整个文件到内存,减少内存占用。
代码实现思路
- 异步文件读写
const fs = require('fs');
const util = require('util');
const readFileAsync = util.promisify(fs.readFile);
async function readMyFile() {
try {
const data = await readFileAsync('path/to/file.txt', 'utf8');
console.log(data);
} catch (err) {
console.error(err);
}
}
readMyFile();
- 数据库连接池(以MySQL为例)
const mysql = require('mysql2');
const pool = mysql.createPool({
host: 'localhost',
user: 'root',
database: 'test',
waitForConnections: true,
connectionLimit: 10,
queueLimit: 0
});
const promisePool = pool.promise();
async function queryDatabase() {
try {
const [rows] = await promisePool.query('SELECT * FROM users');
console.log(rows);
} catch (err) {
console.error(err);
}
}
queryDatabase();
- 使用缓存
const NodeCache = require('node-cache');
const myCache = new NodeCache();
async function getData() {
let data = myCache.get('myDataKey');
if (data) {
return data;
}
// 如果缓存中没有,从数据库或文件读取
data = await readFromSource();
myCache.set('myDataKey', data);
return data;
}
async function readFromSource() {
// 模拟从数据库或文件读取数据
return { message: 'Data from source' };
}
getData().then(console.log);
- 文件流操作
const fs = require('fs');
const readableStream = fs.createReadStream('path/to/largeFile.txt');
const writableStream = fs.createWriteStream('path/to/newFile.txt');
readableStream.pipe(writableStream);
readableStream.on('error', (err) => {
console.error('Read error:', err);
});
writableStream.on('error', (err) => {
console.error('Write error:', err);
});