温馨提示×

Node.js在Linux上如何进行数据存储

小樊
43
2025-11-10 08:21:44
栏目: 云计算

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存储步骤
    1. 安装MySQLsudo yum install mysql-server -y && sudo systemctl start mysqld && sudo systemctl enable mysqld
    2. 创建数据库与表:登录MySQL后执行CREATE DATABASE mydb; USE mydb; CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50), age INT);
    3. 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);
        
  • PostgreSQL存储步骤
    1. 安装PostgreSQLsudo yum install postgresql-server postgresql-contrib -y && sudo postgresql-setup --initdb --unit postgresql && sudo systemctl start postgresql && sudo systemctl enable postgresql
    2. 创建数据库与表:切换至postgres用户,执行createdb mydb && psql mydb -c "CREATE TABLE products (id SERIAL PRIMARY KEY, name VARCHAR(100), price DECIMAL(10,2));"
    3. 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);
        
  • 注意事项
    • 使用参数化查询(如?$1)防止SQL注入。
    • 生产环境需配置数据库用户权限、备份策略(如mysqldumppg_dump)。

3. NoSQL数据库存储(MongoDB)

MongoDB是非关系型数据库,适合存储半结构化/非结构化数据(如JSON文档、日志、用户行为数据),无需预定义表结构,扩展性强。

  • 存储步骤
    1. 安装MongoDB
      • 添加官方仓库:cat << EOF | sudo tee /etc/yum.repos.d/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=1\nenabled=1\ngpgkey=https://www.mongodb.org/static/pgp/server-6.0.asc\nEOF
      • 安装并启动:sudo yum install -y mongodb-org && sudo systemctl start mongod && sudo systemctl enable mongod
    2. 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默认监听27017端口,生产环境需配置认证(如--auth参数)和绑定IP(如--bind_ip_all)。
    • 适合高并发、海量数据的场景,但不支持复杂事务(如跨文档更新)。

4. 缓存存储(Redis)

Redis是内存数据库,适合存储临时数据(如会话信息、热点数据、计数器),读写速度快(微秒级响应),支持多种数据结构(字符串、哈希、列表等)。

  • 存储步骤
    1. 安装Redissudo yum install redis -y && sudo systemctl start redis && sudo systemctl enable redis
    2. 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数据存储在内存中,重启后会丢失(可通过RDB/AOF持久化配置解决)。
    • 生产环境建议使用Redis集群提高可用性和扩展性(如ioredis库支持集群)。

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');
      
  • 系统日志(Syslog/Journald):使用pino-syslog等库将日志发送到系统日志(如local0设施),适合集中管理。
  • 远程日志服务器:集成ELK(Elasticsearch+Logstash+Kibana)或Graylog,实现日志的集中存储、搜索和分析。

0