0

私はNodeJSを使ってフラグをmemcacheに入れています。

これはコードです:

var app = require('express')()
  , server = require('http').createServer(app)
  , io = require('socket.io').listen(server);

var memcache = require('memcache');

var client = new memcache.Client();

server.listen(3005);

io.sockets.on('connection', function (socket) {
    socket.emit('connected');
    
    socket.on('check',function(data){
    
        client.on('connect', function(){
           console.log('connect');
        });

        client.connect();
        
        client.set(data.id, 1, function(error, result){
    
            console.log('Key added');
            console.log(result);
            
            client.get(data.id, function(error, result){

                socket.emit('checked',data.id);

            });
        },600);
    });
});

同時に、約60の接続があります。

一部のユーザーは、このコードの読み込みに約 10 ~ 12 秒かかると不満を漏らしています。

socket.disconect()後に追加されましたsocket.emit('checked',data.id)が、動作が遅くなり始めました。

何か案は?

アップデート

すべてのユーザーは、Android / iOS ネイティブ ブラウザーを使用します。

4

2 に答える 2

3

呼び出しごとに memcached に接続せず、既存の接続を再利用します。

var app = require('express')()
  , server = require('http').createServer(app)
  , io = require('socket.io').listen(server);

var memcache = require('memcache');

var client = new memcache.Client();

server.listen(3005);

client.on('connect', function() {
    console.log('connect');

    io.sockets.on('connection', function (socket) {
        socket.emit('connected');

        socket.on('check',function(data){
            client.set(data.id, 1, function(error, result){

                console.log('Key added');
                console.log(result);

                // maybe unnecessary, just check if error is present
                client.get(data.id, function(error, result){
                    socket.emit('checked',data.id);
                });
            },600);
        });
    });
});

client.connect();
于 2013-07-03T11:08:13.650 に答える
1

あなたが呼ぶ:

client.connect();

ただし、対応する接続​​ハンドラは、実行したいアクションを実行するのではなく、メッセージをログに記録するだけです。

client.on('connect', function(){
  console.log('connect');
});

あなたは機能を持っています:

client.set(data.id, 1, function(error, result){
  console.log('Key added');
  console.log(result);
  client.get(data.id, function(error, result){
    socket.emit('checked',data.id);
  });
},600);

..これは実際にはハンドラー内にラップする必要があるclient.on("connect")ので、なぜあなたのコードが成功するのだろうか?

おそらく、memcached にアクセスするための最初または最初の数回の試行は失敗しますが、client変数が再利用され、接続が維持される可能性があるため、成功する可能性があります。しかし - 危険です。

于 2013-06-30T09:42:34.883 に答える