谷歌appengine / node / memcache失败,对象超过〜3.5k - 我错过了什么?

时间:2016-03-08 03:37:09

标签: node.js google-app-engine memcached

我的应用程序在我的开发机器上工作正常(osx,本地memcached)但是当我将它移动到appengine它失败了。我跟踪它到memcache没有存储大约3.5k的对象。

这是一个在快递下运行的小测试。它需要一个长度值来制作缓冲区,将其发送到memcache并尝试将其恢复。它在本地工作正常,达到预期的1MB限制,然而在appengine它在大约3600 +/- 200的长度失败(它变化,这真的很奇怪)。我已经尝试了几个不同的memcache库,它们都以同样的方式失败了。

//memcache test.
app.get('/mct/:len',function(req,res)  {
  var memcachedAddr = process.env.MEMCACHE_PORT_11211_TCP_ADDR || 'localhost';
  var memcachedPort = process.env.MEMCACHE_PORT_11211_TCP_PORT || '11211';
  var memcacheServer = memcachedAddr + ":" + memcachedPort;
  var Memcached = require('memcached');
  var client = new Memcached(memcacheServer);
  var len = req.params.len * 1; //lazy cast to int
  var text = new  Array(len + 1).join( " " );

  try {
    client.set("testkey",text,600,function(err,val) {
        client.get("testkey",function(err,data) {
            if (data && data.length === text.length) {
                res.send("OK at length " + text.length + " " +data.length);
            } else {
                res.send("Failed at " + text.length + " " );
            }
        });
    })
  } catch(e) {
    res.send("Failed at " + text.length + " " + e.message);
  }
});

1 个答案:

答案 0 :(得分:0)

您正在向memcache发送一个Buffer对象,而不是字符串。我对Node上的Buffer实现一无所知,但我认为它可以提前分配更多的内存然后实际需要。例如,在.NET中,当它超过当前分配的限制时,通常会将缓冲区大小加倍。

尝试将缓冲区转换为字符串并将其作为字符串存储在memcache值中。这应该会有所帮助。