我已經在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);
'需要注意的一點是,當數據庫表中的值發生更改時,應立即反映,因爲應用程序是實時的。我想你回答你的問題是什麼問題? – farhadamjady
什麼是您的數據庫? –
當您的應用程序啓動時,從數據庫中讀取a和b,並將它們存儲在變量中。然後只有在從管理端更改值時才更新它們。 –