AWS Lambda Java-实现简单的缓存以读取文件

时间:2019-09-12 23:44:01

标签: caching aws-lambda

我在Java中有一个lambda进程,每次触发它都会读取带有表的json文件。我想实现一种将文件存储在内存中的缓存,我想知道如何做一些简单的事情。我不想使用Elasticchache或Redis。

我读了一些与我在javascript中用let声明全局变量的方法类似的方法,但不确定如何在Java中进行操作,应在何处声明以及如何对其进行测试。您能提供我什么想法或例子吗?谢谢

2 个答案:

答案 0 :(得分:0)

  • lambda中有global variables可能会有所帮助,但必须明智地使用它们。
  • 它们通常是在lambda_handler边声明的变量。
  • 使用它有优点和缺点。
  • 您不能依赖此行为,但是必须知道它的存在。多次调用Lambda函数时,您 MIGHT 会获得相同的容器,以优化运行时间和设置延迟Use of Global Variables
  • 与此同时,您应该了解问题或避免错误使用caching issues
  • 如果您不想使用ElastiCache / redis,那么我想您剩下的选择就很少了。......可能是dynamoDB或{{1}我能想到的就是这些 同样可以在此处缓存与S3dynamoDB的连接。但是速度不会像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,则它们都将拥有自己的独立缓存。最终,这可以满足您的需求-在冷启动期间这是缓存的惰性加载,并且缓存可重用于热调用。