Sil*_*ohn 14 c# caching azure azure-functions
我们计划开发一个Azure函数,其输入触发器是服务总线消息,输出将是blob存储.服务总线消息将包含图像URL,该功能将图像调整为预定义的分辨率,并上传到azure blob存储.
应该调整图像大小的分辨率存储在数据库中,Azure函数需要调用数据库以了解应该在输入消息中用于图像的分辨率.分辨率实际上是基于输入消息源配置的主数据.
进行数据库调用将是一项昂贵的调用,因为每次调用都必须进入数据库.有没有办法缓存数据并在不调用数据库的情况下使用它.喜欢内存缓存?
Mik*_*kov 20
您可以自由使用在其他.NET应用程序中使用的常用方法:
您可以将其缓存在内存中.最简单的方法是声明一个静态字典并将数据库值放入其中(如果需要,使用并发字典).缓存的值将重用于在同一实例上运行的所有后续Function执行.如果实例空闲5分钟,或者App扩展到额外的实例,则必须再次读取数据库;
您可以使用功能代码中的SDK来使用分布式缓存,例如Redis.可能会更好一些,因为你保持函数的无状态特性,但可能会花费更多.表存储是Redis的可行替代方案,但API有限.
Azure函数本身没有"缓存"功能,可以在没有任何额外代码的情况下使用.
小智 7
Redis 是内存缓存,并且您可以使用自定义输出绑定来保持函数干净:
[FunctionName("SetPoco")]
public static async Task<IActionResult> SetPoco(
[HttpTrigger("POST", Route = "poco/{key}")] HttpRequest request,
[Redis(Key = "{key}")] IAsyncCollector<CustomObject> collector)
{
string requestBody;
using (var reader = new StreamReader(request.Body))
{
requestBody = reader.ReadToEnd();
var value = JsonConvert.DeserializeObject<CustomObject>(requestBody);
await collector.AddAsync(value);
}
return new OkObjectResult(requestBody);
}
Run Code Online (Sandbox Code Playgroud)
项目链接: https: //github.com/daulet/Indigo.Functions#redis
但是,如果内存中的缓存是指函数的内存中,我强烈建议否则,因为函数是无状态的,并且您将无法在运行函数的多个主机之间共享该内存。Azure Functions 最佳实践中也不建议这样做
您可以使用Azure缓存服务(https://azure.microsoft.com/en-us/services/cache/)来缓存数据。基本上,在您的Azure函数中,而不是一直调用数据库,请调用Azure缓存并使用它是否未过期,是否已过期或未设置,然后调用数据库以获取值并使用适当的过期逻辑填充缓存(超时后固定时间或其他自定义逻辑)。
| 归档时间: |
|
| 查看次数: |
9963 次 |
| 最近记录: |