2017-06-13 11 views
0

Nodejsでリアルタイムアプリケーションを作成しました。socket.ioを使用して、指定されたチャネルのすべての接続ユーザーにデータをブロードキャストしています。 API-urlへのhttpコールを例えば:http://example.com/api/token=tokenumber、1秒ごとに行い、新しいjsonデータを取得しています。このデータは、クライアント側にプッシュされる前に算術演算を行う必要があります(算術演算を実行するには、mongoやmysqlのようにdbに接続し、計算に使用するデータを取得する必要があります)。これらaとb変数は動的であり、コントロールパネルのいくつかの並べ替えを使用して管理者によって設定されているので、ここでは例 - ワークフロー リアルタイムアプリケーション用のデータベースへのクエリを最適化する方法 - 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 

ため

は、我々は、DBに接続します。

号現在、私はHTTP呼び出し1秒ごとに作っていますので、すべての1秒をDBへ接続してい

。しかし、私は、aとbの値は、管理者がコントロールパネルにログインしてそれらの値を変更するまでは同じであると確信しています。 リソースの短期間の浪費、私は1秒ごとにdbに接続し、同じ変更されていない値を得ることによってリソースを多用していると信じています

これを最適化する方法を教えてください。データベーステーブルの変更が発生したかどうか、変更が発生した場合、新しい値を取得してメモリ内のキャッシュを使用して格納する方法を教えてください。値が変更されていない場合はdbに追加します。

データベーステーブルの値が変更されたときに、アプリケーションがリアルタイムで反映されているため、すぐに反映されるはずです。

データベーステーブルのチェックを1分または5分ごとに実行して、値が変更されているかどうか、そのキャッシュの新しい値に応じて調べるソリューションがあります。これは、t0でaとbの値を変更すると最悪の場合、1〜5分後に更新ビューになり、dbへの実行が行われると、私はこれを望んでいないことを意味します。

更新

だから私は前に説明したように、私は私のコードを持っている:私は値を保存しようとしていますいくつかの変数X dBのが、機能テストがあるので、次のことを呼ぶがundefinedに設定されます上から引っ張っN秒ごとに呼び出されます。 dbへの接続は一度だけ発生します

私は、アプリケーションが実行されているときにのみDBに電話をかけます。管理者が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); 
+0

'データベーステーブルで値が変更されると、アプリケーションがリアルタイムで反映されるため、値がすぐに反映されるはずです。私はあなたの質問に答えると思いますので、何が問題なのですか? – farhadamjady

+0

あなたのデータベースは何ですか? –

+0

あなたのアプリが起動すると、データベースからaとbを読み込み、それらを変数に格納します。その後、値がadmin側から変更されたときにのみ更新します。 –

答えて

0

最良の方法は、Nodejsキャッシュを使用することですコード:https://www.npmjs.com/package/node-cacheまたはhttps://www.npmjs.com/package/node-file-cache

それは単にあなたが好きなデータを書き込み、ファイル内で(キー値ペアとしてあなたが望む限り長く)。値の設定、取得、更新は簡単です。複数のキーと値のペアを取得することもできます。

関連する問題