我在Java中有一个lambda进程,每次触发它都会读取带有表的json文件。我想实现一种将文件存储在内存中的缓存,我想知道如何做一些简单的事情。我不想使用Elasticchache或Redis。
我读了一些与我在javascript中用let声明全局变量的方法类似的方法,但不确定如何在Java中进行操作,应在何处声明以及如何对其进行测试。您能提供我什么想法或例子吗?谢谢
答案 0 :(得分:0)
global variables
可能会有所帮助,但必须明智地使用它们。lambda_handler
边声明的变量。ElastiCache
/ redis
,那么我想您剩下的选择就很少了。......可能是dynamoDB
或{{1}我能想到的就是这些
同样可以在此处缓存与S3
或dynamoDB
的连接。但是速度不会像S3
那样快。 答案 1 :(得分:0)
在Java中,这并非难事。只需在处理程序之外创建缓存:
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import com.amazonaws.services.lambda.runtime.RequestStreamHandler;
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.LambdaLogger;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
public class SampleHandler implements RequestStreamHandler {
private static final Logger logger = LogManager.getLogger(SampleHandler.class);
private static Map<String, String> theCache = null;
public SampleHandler() {
logger.info( "filling cache...");
theCache = new HashMap<>();
theCache.put("key1", "value1");
theCache.put("key2", "value2");
theCache.put("key3", "value3");
theCache.put("key4", "value4");
theCache.put("key5", "value5");
}
public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) throws IOException {
logger.info("handlingRequest");
LambdaLogger lambdaLogger = context.getLogger();
ObjectMapper objectMapper = new ObjectMapper();
JsonNode jsonNode = objectMapper.readTree(inputStream);
String requestedKey = jsonNode.get("requestedKey").asText();
if( theCache.containsKey( requestedKey )) {
// read from the cache
String result = "{\"requestedValue\": \"" + theCache.get(requestedKey) + "\"}";
outputStream.write(result.getBytes());
}
logger.info("done with run, remaining time in ms is " + context.getRemainingTimeInMillis() );
}
}
(与带有aws lambda invoke --function-name lambda-cache-test --payload '{"requestedKey":"key4"}' out
的AWS cli一起运行,输出进入文件out
)
当它以“冷启动”运行时,您将在CloudWatch日志中看到“正在填充缓存...”消息,然后是“ handlingRequest”。只要Lambda保持“温暖”,您就不会再看到缓存消息。
请注意,如果您同时运行数百个相同的Lamda,则它们都将拥有自己的独立缓存。最终,这可以满足您的需求-在冷启动期间这是缓存的惰性加载,并且缓存可重用于热调用。