MST

星途 面试题库

面试题:Node.js中处理高并发请求时,如何优化I/O操作

在Node.js处理高并发请求场景下,I/O操作可能成为性能瓶颈。请阐述你会采用哪些方式优化I/O操作,比如文件读写、数据库查询等,以提升整体系统在高并发时的性能,并举例说明相关的代码实现思路。
48.6万 热度难度
前端开发Node.js

知识考点

AI 面试

面试题答案

一键面试

优化方式

  1. 使用异步I/O:Node.js 本身基于事件驱动和非阻塞I/O模型,应充分利用这一特性。例如在文件读写中,使用fs.readFile(异步)而非fs.readFileSync(同步)。
  2. 连接池:对于数据库查询,使用连接池来管理数据库连接。以MySQL为例,mysql2库提供了连接池功能。这可以避免每次请求都创建新连接的开销,提高复用率。
  3. 缓存:在适当场景下使用缓存,如node-cache。对于频繁读取且不经常变化的数据,先从缓存中获取,减少数据库或文件系统的I/O操作。
  4. 流操作:在处理大文件读写时,使用流(stream)。如fs.createReadStreamfs.createWriteStream,它逐块处理数据,而非一次性加载整个文件到内存,减少内存占用。

代码实现思路

  1. 异步文件读写
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();
  1. 数据库连接池(以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();
  1. 使用缓存
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);
  1. 文件流操作
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);
});