Nodejs 通过UDP接收数据后缓存再保存到数据库

Nodejs 通过UDP接收数据后缓存再保存到数据库

用Node.js做api 用UDP接收数据后如何缓存后再保存到数据库? 因为接收到的数据可能会比较多,不可能每来一条数据就保存一次吧。。

请大家给点意见,谢谢。

8 回复

用Node.js做api 用UDP接收数据后如何缓存后再保存到数据库? 因为接收到的数据可能会比较多,不可能每来一条数据就保存一次吧。。

请大家给点意见,谢谢。


大家都没想法吗。。

当然可以。下面是一个使用Node.js通过UDP接收数据,并将数据缓存一段时间后再批量保存到数据库的示例。

示例代码

首先,我们需要安装必要的库:

npm install dgram mysql2

接下来是Node.js脚本的实现:

const dgram = require('dgram');
const mysql = require('mysql2/promise');

// 创建一个UDP服务器
const server = dgram.createSocket('udp4');

// 数据缓存
let dataCache = [];
const cacheTimeout = 1000; // 缓存超时时间(毫秒)

server.on('message', (msg, rinfo) => {
    console.log(`Received ${msg.length} bytes from ${rinfo.address}:${rinfo.port}`);
    dataCache.push(msg.toString());
    
    // 每次收到数据后启动或重置定时器
    if (!server.cacheTimer) {
        server.cacheTimer = setTimeout(() => {
            saveToDatabase();
            dataCache = []; // 清空缓存
            delete server.cacheTimer;
        }, cacheTimeout);
    }
});

async function saveToDatabase() {
    try {
        const connection = await mysql.createConnection({
            host: 'localhost',
            user: 'root',
            database: 'your_database'
        });

        // 批量插入数据
        const query = `INSERT INTO your_table (data) VALUES ?`;
        const values = dataCache.map(data => [data]);
        
        await connection.execute(query, [values]);
        console.log(`${dataCache.length} records saved to the database.`);
        await connection.end();
    } catch (error) {
        console.error('Error saving to database:', error);
    }
}

server.on('listening', () => {
    const address = server.address();
    console.log(`Server listening on ${address.address}:${address.port}`);
});

server.bind(41234); // 绑定端口

解释

  1. UDP服务器创建

    • 使用dgram.createSocket('udp4')创建一个UDP服务器。
  2. 数据缓存

    • 接收数据后,将其推入dataCache数组中。
    • 使用定时器setTimeout来设置一个超时时间(例如1秒),超时后会调用saveToDatabase函数并将缓存中的数据保存到数据库。
  3. 批量保存到数据库

    • 使用mysql2库连接到MySQL数据库。
    • 构建批量插入的SQL语句并执行。
  4. 错误处理

    • 在保存数据时捕获并处理可能出现的任何错误。

这样,你就可以有效地缓存接收到的数据并在一定时间后批量保存到数据库中,从而减少数据库的写操作次数。

保存到redis

数据过来之后先存到缓存或者队列,后面再写个脚本从缓存里读取再写到数据库

如果真是大量数据还是建议直接写到文件里面 然后再跑定时脚本慢慢处理 如果大量数据可能redis也会处理不过来

谢谢。十分感谢。

要实现Node.js通过UDP接收数据并缓存,然后再批量保存到数据库的功能,可以使用一个简单的缓存机制(例如数组)来存储接收到的数据,并设置一个定时器定期将这些数据保存到数据库中。下面是一个具体的实现方案:

  1. 创建UDP服务器:监听指定端口并接收数据。
  2. 缓存数据:将接收到的数据添加到缓存数组中。
  3. 定时保存:设置定时器,定期将缓存中的数据批量保存到数据库。

下面是具体的代码示例:

const dgram = require('dgram');
const client = dgram.createSocket('udp4');
const express = require('express');
const app = express();
const mysql = require('mysql');

// 创建MySQL连接
const db = mysql.createConnection({
    host: 'localhost',
    user: 'yourusername',
    password: 'yourpassword',
    database: 'yourdatabase'
});

db.connect((err) => {
    if (err) throw err;
    console.log('Connected to database');
});

let cache = [];

client.on('message', (msg, rinfo) => {
    // 将接收到的数据添加到缓存中
    cache.push(msg.toString());
    
    console.log(`Received message: ${msg} from ${rinfo.address}:${rinfo.port}`);
});

// 定时任务,每5秒执行一次,将缓存的数据保存到数据库
setInterval(() => {
    if (cache.length > 0) {
        const dataToSave = cache.slice(); // 复制当前缓存
        cache = []; // 清空缓存

        // 批量插入数据库
        const query = `INSERT INTO your_table_name (data_column) VALUES ?`;
        db.query(query, [dataToSave.map(item => [item])], (err, results) => {
            if (err) throw err;
            console.log(`${results.affectedRows} rows inserted`);
        });
    }
}, 5000);

client.bind(41234); // 绑定端口

解释:

  • 使用dgram模块创建UDP服务器。
  • 每次接收到数据时,将其推入缓存数组。
  • 设置一个定时器,每5秒钟检查一次缓存,如果有数据则批量插入到数据库中。
  • 使用mysql模块连接到MySQL数据库,并进行批量插入操作。

这种方法可以有效减少与数据库的交互次数,提高程序性能。

回到顶部