2017-06-13 40 views
0

我已經在Nodejs中創建了一個實時應用程序,並且我正在使用socket.io向給定通道中的所有連接用戶廣播數據。我正在對API-url進行http調用,例如:每1秒發送一次http://example.com/api/token=tokenumber,並獲取新的json數據。這些數據在推送到客戶端進行查看之前需要進行算術運算(爲了執行算術運算,應用程序需要連接到db,如:mongo或mysql並獲取將用於計算的數據)。如何優化實時應用程序的數據庫查詢 - Nodejs

的示例 - 工作流程

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 

在這裏,我們連接到數據庫,因爲這些a和b變量是動態的,並使用某種形式的控制面板由Admin設置。

問題

目前,我連接到DB每1秒,因爲我在做HTTP調用每1秒。但我相當肯定,在任何管理員用戶登錄控制面板並更改這些值之前,a和b的值都是相同的。 短暫的浪費資源,我相信我通過連接到db每1秒大量使用資源,並獲得相同的未改變的值

我該如何優化?如何查找數據庫表中是否發生任何更改以及是否發生了任何更改,如何獲取新值並使用某種內存緩存存儲它,以便通過不連接來節省時間和資源到數據庫時值不變。

需要注意的一件事是,當數據庫表中的值發生更改時,它們應該立即反映,因爲應用程序是實時的。

我知道的解決方案是每1分鐘或5分鐘檢查一次數據庫表,以確定值是否已更改或取決於緩存的新值。但這意味着如果我在t0更改a和b的值,最壞的情況是1或5分鐘後更新視圖,一旦執行到db,我不想這樣做。

更新

所以,我有我的代碼就像我以前解釋過:我試圖挽救拉從數據庫到一些變量X,但在下稱之爲被設置爲未定義的值,因爲功能測試稱爲每N秒。但連接數據庫只發生一次

我只會在應用程序運行時調用數據庫,並且每當管理員對數據庫進行任何更改並點擊提交按鈕時,我都會再次調用它。

我不想進行任何數據庫調用,但使用從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); 
+0

'需要注意的一點是,當數據庫表中的值發生更改時,應立即反映,因爲應用程序是實時的。我想你回答你的問題是什麼問題? – farhadamjady

+0

什麼是您的數據庫? –

+0

當您的應用程序啓動時,從數據庫中讀取a和b,並將它們存儲在變量中。然後只有在從管理端更改值時才更新它們。 –

回答