如何针对实时应用程序优化数据库查询 - Nodejs

时间:2017-06-13 10:40:02

标签: node.js database real-time

我在Nodejs中创建了一个实时应用程序,我正在使用socket.io向给定频道中的所有连接用户广播数据。我每隔1秒对API-url进行一次http调用,例如:http://example.com/api/token=tokenumber并获取新的json数据。在推送到客户端进行查看之前,这些数据需要进行算术运算(为了执行算术运算,app需要连接到db,如:mongo或mysql,并获取将用于进行计算的数据)。 / p>

例如 - 工作流程

step 1) make http call  [received data x=80, y=90]
step 2) connect to db   [received data a=10, b=20]
step 3) do calculation  [finalval = x*a + y*b]
step 4) push data to view

在这里,我们连接到db,因为那些 a和b变量是动态的,并且由管理员使用某种控制面板设置。

问题

目前,我每1秒连接一次数据库,因为我每1秒进行一次http调用。但我很确定a和b的值将相同,直到任何管理员用户登录控制面板并更改这些值。 短暂浪费资源,我相信我每隔1秒连接到数据库并获得相同的未更改值会大量使用资源

如何优化此功能?如何确定是否发生了数据库表的任何更改以及是否发生了任何更改,如何获取新值并使用某种内存缓存来存储它,以便通过不连接来节省时间和资源当值不变时到数据库。

需要注意的一点是,当数据库表中的值发生变化时,它们应该立即反映,因为app是实时的。

我知道每1分钟或5分钟检查数据库表的解决方案,以确定值是否已更改,并取决于缓存新值。但这意味着如果我在t0更改a和b的值,最坏的情况是1或5分钟后更新视图,一旦执行到db,我不想要这个。

更新

所以,我有我之前解释过的代码:我正在尝试将从db中提取的值保存到某个变量X.但是在下一次调用时,设置为undefined,因为每隔N秒调用一次函数测试。但是与db的连接只发生一次

我只会在应用运行时调用数据库,每当管理员对数据库进行任何更改并点击提交按钮时,我都会再次调用它。

我不想进行任何数据库调用,但在此之前使用从Db中提取的相同值。我尝试将它存储在一个变量中,但是一旦下一次调用发生,就会将同一个变量设置为undefined。

代码

//requiring model products
var Product = require('./models/product');

//Here function is an async callback 
Product.find(function (err, products) {
  if (err) return console.error(err);
  console.log("callback function results: "+products);
  //I am passing data to test function once I receive the data from MongoDB
  test(products);
});

//This function is called every N seconds
function test(val) {
//Here I am trying to store mongoDB data to variable hello
var hello = val;

//This prints only once when data from mongodb is recieved then next very second its set to undefined.

console.log("stored value from db: "+hello);
http.get("api url", function(res) {
    var body = '';
    res.on('data', function(data) {
        body += data;
    });

    res.on('end', function() {
        var parsed = JSON.parse(body);
        var dataArray = [];
        //I need access to mongoDB data right here and use it in some arithmetic operation 
        var p1 = parsed.data.example1 + hello[0].price;

        //finally push data into array
        dataArray.push(p1);

        console.log(dataArray);
        //pushing to socket channel - live
        nsp.emit('live', dataArray);
    });
});

}

模型

var mongoose = require('mongoose');
mongoose.connect('mongodb://username:pswd....');
var db = mongoose.connection;

//Product Schema
var ProductSchema = mongoose.Schema({
    name:{
        type: String
    },
    price:{
        type: Number
    },
    unit:{
        type:Number
    },
    type:{
        type:String
    }
});

var Product = module.exports = mongoose.model('Product', ProductSchema);

1 个答案:

答案 0 :(得分:0)

实现这一目标的最佳方法是使用Nodejs缓存:https://www.npmjs.com/package/node-cachehttps://www.npmjs.com/package/node-file-cache

它只是在文件中写入您想要的任何数据(根据需要存储为键值对)。可以轻松设置,检索或更新值。您还可以获得多个键值对。