Debian环境下JS(Node.js)数据存储的常见方法
在Debian系统中,JavaScript(通常通过Node.js运行时)的数据存储需根据数据规模、持久性需求及性能要求选择合适的方式。以下是具体实现方法:
内存存储是将数据保存在Node.js进程的内存中,通过变量或对象实现。这种方式存取速度极快,但进程重启或服务器宕机后数据会丢失,仅适用于临时数据(如缓存、会话信息)。
// 示例:用变量存储计数器
let count = 0;
app.get('/increment', (req, res) => {
count++;
res.send(`Current count: ${count}`);
});
注意:需避免内存泄漏(如未清理的全局变量)。
通过Node.js的fs模块将数据写入文件(如JSON、TXT),适合小规模、非高频写入的数据(如配置信息、日志)。需注意并发写入问题(建议使用异步方法+锁机制)。
const fs = require('fs');
// 写入JSON文件
const data = { name: 'John', age: 30 };
fs.writeFile('data.json', JSON.stringify(data), (err) => {
if (err) throw err;
console.log('Data saved to file');
});
// 读取JSON文件
fs.readFile('data.json', 'utf8', (err, data) => {
if (err) throw err;
console.log(JSON.parse(data));
});
优化:使用fs.promises实现异步操作,或用lowdb库简化JSON文件管理。
适用于复杂查询、事务处理的场景(如用户管理、订单系统),Debian下常用MySQL/MariaDB或PostgreSQL。
sudo apt update && sudo apt install mysql-serversudo mysql_secure_installation设置root密码,修改/etc/mysql/mysql.conf.d/mysqld.cnf调整绑定地址(如bind-address = 0.0.0.0允许远程访问)。mysql2库(支持Promise)。const mysql = require('mysql2/promise');
async function query() {
const connection = await mysql.createConnection({ host: 'localhost', user: 'root', password: 'password', database: 'test' });
const [rows] = await connection.execute('SELECT * FROM users');
console.log(rows);
await connection.end();
}
query();
sudo apt update && sudo apt install postgresql postgresql-contrib/etc/postgresql/<version>/main/postgresql.conf设置listen_addresses = '*',编辑pg_hba.conf允许远程访问(如host all all 0.0.0.0/0 md5)。pg库。const { Client } = require('pg');
async function query() {
const client = new Client({ user: 'postgres', password: 'password', database: 'test', host: 'localhost' });
await client.connect();
const res = await client.query('SELECT * FROM users');
console.log(res.rows);
await client.end();
}
query();
备份:使用mysqldump(MySQL)或pg_dump(PostgreSQL)定期备份数据库。
适合高并发、海量数据场景(如实时聊天、物联网数据),Debian下常用MongoDB(文档型)或Redis(键值型)。
sudo apt update && sudo apt install mongodbmongoose库(提供Schema验证)。const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost:27017/test', { useNewUrlParser: true, useUnifiedTopology: true });
const userSchema = new mongoose.Schema({ name: String, age: Number });
const User = mongoose.model('User', userSchema);
async function saveUser() {
const user = new User({ name: 'Alice', age: 25 });
await user.save();
console.log('User saved');
}
saveUser();
sudo apt update && sudo apt install redis-serverioredis库(支持集群)。const Redis = require('ioredis');
const redis = new Redis();
async function setValue() {
await redis.set('key', 'value');
const value = await redis.get('key');
console.log(value); // 'value'
}
setValue();
备份:MongoDB通过mongodump备份,Redis通过BGSAVE命令或redis-cli save手动保存。
日志是排查问题的关键,Debian下可通过以下方式存储JS应用日志:
支持多传输方式(文件、控制台、数据库),配置日志级别(info、error)和轮转(避免文件过大)。
const winston = require('winston');
const logger = winston.createLogger({
level: 'info',
format: winston.format.json(),
transports: [
new winston.transports.File({ filename: '/var/log/app.log' }),
new winston.transports.Console()
]
});
logger.info('Application started');
通过logrotate工具自动分割、压缩日志文件,防止占用过多磁盘空间。创建/etc/logrotate.d/app配置文件:
/var/log/app.log {
daily
rotate 7
compress
missingok
notifempty
create 640 root adm
}
说明:daily表示每日轮转,rotate 7保留7天日志,compress压缩旧日志。