您可以缓存一个变量以在 C# AWS Lambda 函数调用之间使用

use*_*707 1 c# amazon-web-services aws-lambda

我想在 C# Lambda 调用之间使用缓存,我知道如果 Lambda 从冷启动,这是不可能的,但如果在短时间内被多次调用,我们可以使用缓存。

我尝试过创建一个静态变量,但这似乎在每次调用后都会重新初始化?

有人有主意吗?下面是一个示例,我希望每次将 TestCache 变量增加 1,但这总是返回 1。

using Amazon.Lambda.APIGatewayEvents;
using Amazon.Lambda.Core;
using System.Collections.Generic;

// Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class.
[assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))]

namespace MyTestLambda
{
    public class Global
    {
        private readonly Dictionary<string, string> allOriginHeaders = new Dictionary<string, string>
            {
                { "Access-Control-Allow-Origin", "*" }
            };

        public static int TestCache = 0;

        public APIGatewayProxyResponse Handler(APIGatewayProxyRequest apigProxyEvent)
        {
            TestCache += 1;

            return new APIGatewayProxyResponse
            {
                Body = TestCache.ToString(),
                StatusCode = 200,
                Headers = allOriginHeaders
            };
        }
    }
}
Run Code Online (Sandbox Code Playgroud)
  • 更新 *

我意识到实际上我的代码确实缓存,但必须创建多个实例。就我而言,我正在负载测试中一次抛出 500 个请求,所有返回的请求都是相同的,但是当我手动进行一项一项测试时,数字确实增加了。根据下面的答案,我将把弹性缓存视为一种更好的方法。

Mar*_*cin 5

某种形式的缓存可以通过AWS Lambda 执行上下文来实现:

执行 Lambda 函数后,AWS Lambda会在一段时间内维护执行上下文,以等待下一次 Lambda 函数调用。

要使用它,您的变量必须在函数处理程序之外声明:

在函数处理程序方法之外声明的对象保持初始化状态,从而在再次调用函数时提供额外的优化。例如,如果您的 Lambda 函数建立了数据库连接,则在后续调用中将使用原始连接,而不是重新建立连接。

然而,使用执行上下文的问题是,AWS 不提供任何关于可以使用它的时间的保证:

当您编写 Lambda 函数代码时,不要假设AWS Lambda 自动为后续函数调用重用执行上下文。

因此,基于 lambda 执行上下文的缓存解决方案可以发挥作用,但在很多方面都会受到限制。对于正确的缓存解决方案,您必须在 lambda 之外寻找,例如将序列化对象存储在ElastiCacheDynamoDB更多中。

我尝试过创建一个静态变量,但这似乎在每次调用后都会重新初始化?

您尚未提供任何代码,但可能的原因可能是您的变量在函数处理程序中初始化。如上所述,您的对象/变量应该在函数处理程序之外声明才能重用。