使用AWS lambda。我们尝试使用node-cache
模块来从另一个API获取数据。即使数据正在被设置。当下一个请求到来时,node-cache
无法缓存该数据。
下面是我示例代码
//not the original code
let ClassService = require("./NodeCacheTest");
exports.handler = async (event) => {
let classService = new ClassService();
classService.getKey("myKey", (err, value)=> {
console.log(value);
});
};
//NodeCacheTest
const NodeCache = require( "node-cache" );
const myCache = new NodeCache();
let CACHEDATA = {
testing: true,
time_to_live: 10
};
class NodeCacheTest {
constructor () {
let obj = { my: "Special", variable: 42 };
myCache.get( "myKey", function( err, value ){
if( err || value == undefined) {
console.log("No value available!!!");
myCache.set( "myKey", obj, 10000 );
console.log("value got cached!!!");
}
});
}
getKey(key, cb) {
let obj = { my: "Special", variable: 42 };
myCache.get( "myKey", function( err, value ){
if( err || value == undefined) {
console.log("No value available!!!");
myCache.set( "myKey", obj, 10000 );
console.log("value got cached!!!");
return cb(null,obj);
} else {
return cb(null, value);
}
});
}
}
module.exports = NodeCacheTest;
每次我使用Jmeter
击中aws lambda
端点时...我看到每个调用No value available!!!
都被打印出来。但是当我使用一些全局变量(如CACHEDATA
)来实现相同的场景时,值被缓存。谁能解释一下我在这方面的行为。
2条答案
按热度按时间qcuzuvrc1#
由于Lambda的工作方式,您无法在Lambda中使用节点缓存。
Lambda使用的存储不是持久性的。Lambda在容器中运行。有时候你可能会得到容器重用,缓存的数据仍然可用,但这是非常不可靠的。
如果你正在缓存数据,你应该看看其他服务,比如Elasticache,或者你甚至可以按需使用DynamoDB。
v09wglhw2#
以下是我的答案,也是来自我写的here的评论:
只要lambda的当前执行上下文是有效的,lambda缓存将是完整的。当AWS Lambda执行一个函数时,它会创建一个“执行上下文”,这是一个临时的运行时环境,外部依赖项在其中初始化。当函数是温函数时,并且如果后续请求足够接近,则执行上下文被重用,并且因此存储器中缓存的数据可用。一旦函数变冷,执行上下文就被销毁(沿着其内存中的缓存)。因此,如果您的执行相隔较远,内存缓存将无法工作,因为前一个执行上下文将被销毁。
一个更简单的方法是,当函数是“warm”时,缓存将工作。当它变“冷”时该高速缓存被销毁。
如果你有一个每分钟收到大量请求的lambda,这将工作得很好(缓存应该总是做的)。
这里需要注意的是并发性,每个并发执行都有自己的执行上下文。这意味着如果你有5个lambda表达式同时运行,每个lambda表达式都有自己的执行上下文和自己的缓存,这些缓存不与其他lambda表达式共享。
示例
如果你想给予一下,你可以尝试像