0

我正在使用 NodeJS 将标志放入内存缓存中。

这是代码:

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 回答