阅读量:17
Node.js在Linux上的数据存储方式
1. 文件系统存储(内置fs模块)
文件系统是Node.js最基础的数据存储方式,通过内置的fs模块实现文件的读写、追加、删除等操作,适合存储配置文件、日志、静态资源等非结构化或小规模数据。
- 基本操作示例:
- 写入文件(异步):
fs.writeFile('data.json', JSON.stringify({name: 'John'}), (err) => err ? console.error(err) : console.log('写入成功')); - 读取文件(异步):
fs.readFile('data.json', 'utf8', (err, data) => err ? console.error(err) : console.log('文件内容:', data)); - 追加内容:
fs.appendFile('log.txt',\n${new Date()}: 新日志, (err) => err && console.error(err)); - 删除文件:
fs.unlink('temp.txt', (err) => err && console.error(err));
- 写入文件(异步):
- 注意事项:
- 异步操作不会阻塞事件循环,适合高并发场景;同步操作(如
fs.writeFileSync)会阻塞,仅在初始化等场景使用。 - 多用户并发读写同一文件时需通过锁机制(如
proper-lockfile库)避免数据覆盖。
- 异步操作不会阻塞事件循环,适合高并发场景;同步操作(如
2. 关系型数据库存储(MySQL/PostgreSQL)
关系型数据库适合存储结构化数据(如用户信息、订单数据),支持复杂的SQL查询和事务处理。Linux环境下常用MySQL(流行度高)或PostgreSQL(标准兼容性好)。
- MySQL存储步骤:
- 安装MySQL:
sudo yum install mysql-server -y && sudo systemctl start mysqld && sudo systemctl enable mysqld。 - 创建数据库与表:登录MySQL后执行
CREATE DATABASE mydb; USE mydb; CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50), age INT);。 - Node.js连接与操作:
- 安装驱动:
npm install mysql2(比mysql更高效)。 - 代码示例:
const mysql = require('mysql2/promise'); async function main() { const connection = await mysql.createConnection({host: 'localhost', user: 'root', password: '123456', database: 'mydb'}); await connection.execute('INSERT INTO users (name, age) VALUES (?, ?)', ['Alice', 25]); const [rows] = await connection.execute('SELECT * FROM users WHERE name = ?', ['Alice']); console.log(rows); // 输出查询结果 await connection.end(); } main().catch(console.error);
- 安装驱动:
- 安装MySQL:
- PostgreSQL存储步骤:
- 安装PostgreSQL:
sudo yum install postgresql-server postgresql-contrib -y && sudo postgresql-setup --initdb --unit postgresql && sudo systemctl start postgresql && sudo systemctl enable postgresql。 - 创建数据库与表:切换至
postgres用户,执行createdb mydb && psql mydb -c "CREATE TABLE products (id SERIAL PRIMARY KEY, name VARCHAR(100), price DECIMAL(10,2));"。 - Node.js连接与操作:
- 安装驱动:
npm install pg。 - 代码示例:
const { Client } = require('pg'); async function main() { const client = new Client({user: 'postgres', password: '123456', host: 'localhost', database: 'mydb'}); await client.connect(); await client.query('INSERT INTO products (name, price) VALUES ($1, $2)', ['Laptop', 999.99]); const res = await client.query('SELECT * FROM products WHERE name = $1', ['Laptop']); console.log(res.rows); // 输出查询结果 await client.end(); } main().catch(console.error);
- 安装驱动:
- 安装PostgreSQL:
- 注意事项:
- 使用参数化查询(如
?或$1)防止SQL注入。 - 生产环境需配置数据库用户权限、备份策略(如
mysqldump或pg_dump)。
- 使用参数化查询(如
3. NoSQL数据库存储(MongoDB)
MongoDB是非关系型数据库,适合存储半结构化/非结构化数据(如JSON文档、日志、用户行为数据),无需预定义表结构,扩展性强。
- 存储步骤:
- 安装MongoDB:
- 添加官方仓库:
cat << EOF mongodb-org.repo\n[mongodb-org-6.0]\nname=MongoDB Repository\nbaseurl=https://repo.mongodb.org/yum/redhat/\$releasever/mongodb-org/6.0/x86_64/\ngpgcheck nenabled=1\ngpgkey>。 - 安装并启动:
sudo yum install -y mongodb-org && sudo systemctl start mongod && sudo systemctl enable mongod。
- 添加官方仓库:
- Node.js连接与操作:
- 安装驱动:
npm install mongodb。 - 代码示例:
const { MongoClient } = require('mongodb'); async function main() { const client = new MongoClient('mongodb://localhost:27017', {useNewUrlParser: true, useUnifiedTopology: true}); await client.connect(); const db = client.db('mydb'); const collection = db.collection('tasks'); // 插入文档 await collection.insertOne({title: 'Learn Node.js', completed: false}); // 查询文档 const task = await collection.findOne({title: 'Learn Node.js'}); console.log(task); // 输出查询结果 await client.close(); } main().catch(console.error);
- 安装驱动:
- 安装MongoDB:
- 注意事项:
- MongoDB默认监听
27017端口,生产环境需配置认证(如--auth参数)和绑定IP(如--bind_ip_all)。 - 适合高并发、海量数据的场景,但不支持复杂事务(如跨文档更新)。
- MongoDB默认监听
4. 缓存存储(Redis)
Redis是内存数据库,适合存储临时数据(如会话信息、热点数据、计数器),读写速度快(微秒级响应),支持多种数据结构(字符串、哈希、列表等)。
- 存储步骤:
- 安装Redis:
sudo yum install redis -y && sudo systemctl start redis && sudo systemctl enable redis。 - Node.js连接与操作:
- 安装驱动:
npm install redis。 - 代码示例:
const redis = require('redis'); const client = redis.createClient(); client.on('error', (err) => console.error('Redis错误:', err)); client.connect().then(() => { // 设置键值对(过期时间1小时) client.set('session:123', 'user_token_abc', {EX: 3600}); // 获取键值对 client.get('session:123').then((value) => console.log('Session:', value)); // 存储哈希(用户信息) client.hSet('user:1', 'name', 'Alice', 'age', 25); client.hGetAll('user:1').then((user) => console.log('User:', user)); }).catch(console.error);
- 安装驱动:
- 安装Redis:
- 注意事项:
- Redis数据存储在内存中,重启后会丢失(可通过
RDB/AOF持久化配置解决)。 - 生产环境建议使用Redis集群提高可用性和扩展性(如
ioredis库支持集群)。
- Redis数据存储在内存中,重启后会丢失(可通过
5. 日志存储
日志是应用运行的重要记录,可用于排查问题、审计等,Linux环境下可通过以下方式存储:
- 文件系统存储:使用
fs模块将日志追加到文件(如logs/app.log),适合简单场景。 - 日志库(Winston/Bunyan):提供更强大的功能(如分级日志、多传输、格式化)。
- Winston示例:
const winston = require('winston'); const logger = winston.createLogger({ level: 'info', format: winston.format.json(), transports: [ new winston.transports.File({filename: 'logs/error.log', level: 'error'}), new winston.transports.File({filename: 'logs/combined.log'}), ], }); logger.info('This is an info log'); logger.error('This is an error log');
- Winston示例:
- 系统日志(Syslog/Journald):使用
pino-syslog等库将日志发送到系统日志(如local0设施),适合集中管理。 - 远程日志服务器:集成ELK(Elasticsearch+Logstash+Kibana)或Graylog,实现日志的集中存储、搜索和分析。