node.js中用于数据库插入的Redis队列

vnjpjtjt  于 2023-06-05  发布在  Redis
关注(0)|答案(1)|浏览(160)

我需要一些帮助来弄清楚什么是最佳实践,如果你需要在使用node,redis和MySQL/MongoDB时为每个请求插入大量数据。
如何设置一个队列来处理每个请求,如下所示:

  • 用户在我的应用程序中请求一个URL,即/route/insert-data
  • 服务器处理请求,将其添加到Redis队列,并将状态200发送回用户
  • 应用程序以某种间隔检查redis队列中是否有任何内容,如果有,它将选择最旧的一个,将其插入数据库,然后从redis中删除该键

最好的办法是什么?我目前有一个快速的应用程序设置。
谢谢!

jdzmm42g

jdzmm42g1#

我也在寻找类似的解决方案,但如果有人在寻找。伪代码将是:
1.找到最接近(向上舍入)时间戳秒到你的间隔(说每5秒)
1.用那个时间戳作为redis的密钥
1.使用redis append将值附加到该键
1.使用getdel(获取,然后删除,以提高性能)周期性地检查(每秒)最后一个可分割的redis键。
这可能会更有性能,但它只是为了让你理解最简单的流程(redis将是redis客户端,假设你使用的是库:https://github.com/redis/node-redis

function findNearestTimestamp() {
  var currentTime = Math.floor(Date.now() / 1000); // Get the current time in seconds
  var remainder = currentTime % 5; // Calculate the remainder

  if (remainder === 0) {
    return currentTime; // Current time is already divisible by 5 seconds
  } else {
    var nearestTimestamp = currentTime + (5 - remainder); // Calculate the nearest timestamp
    return nearestTimestamp;
  }
}
const sql_values = "('value1', 'value2', 'value3'),";
const redis_key = findNearestTimestamp(5);
redis.append(redis_key,sql_values)

您可以通过一种简单的方法定期检查密钥,例如

function findLastDivisibleTimestamp(seconds) {
      var currentTime = Math.floor(Date.now() / 1000); // Get the current time in seconds
      var remainder = currentTime % seconds; // Calculate the remainder

      var lastDivisibleTimestamp = currentTime - remainder; // Subtract the remainder

      return lastDivisibleTimestamp;
    }

setTimeout(()=> {

    const last_redis_key = findLastDivisibleTimestamp(5)
    const stored_value =  redis.getdel(last_redis_key) 
    const cleaned_value = stored_value ? str.slice(0,-1) : null

    if (!cleaned_value) {
        //run query here by appending values to sql insert such as 
        const query = `INSERT INTO table_name (column1, column2, column3)
    VALUES ${values}`
    }
}), 1 * 1000)

需要注意的是,您需要添加更多的代码,以确保在数据库失败的情况下,您可以捕获它,重试它,追加到下一个,转储它或以其他方式。

相关问题