我的应用程序在我的开发机器上工作正常(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);
}
});
答案 0 :(得分:0)
您正在向memcache发送一个Buffer对象,而不是字符串。我对Node上的Buffer实现一无所知,但我认为它可以提前分配更多的内存然后实际需要。例如,在.NET中,当它超过当前分配的限制时,通常会将缓冲区大小加倍。
尝试将缓冲区转换为字符串并将其作为字符串存储在memcache值中。这应该会有所帮助。