我有一个 lambda 函数,它是一个从数据库获取数据的 api。我想向方法本身添加缓存,其想法是,如果调用 lambda,它应该返回缓存的响应。我了解后续调用可能需要再次从数据库中获取数据。但如果 lru_cache 有助于减少数据库的命中次数,我将实现它。使用 lru_cache 还有什么缺点吗?
在 API 网关中实现缓存在该场景中是最佳选择。
或者我应该使用其他一些缓存机制。
from functools import lru_cache
@lru_cache()
@router.get(
"/myapi/v1",
name="My Api",
status_code=status.HTTP_200_OK,
response_model=ApiModel,
)
Lambda 的生命周期较短。即使您可以将 lambda 保持在热状态,多个请求也会触发新的 lambda 实例,而无需任何类型的缓存。
一个选项是启用 API 网关缓存。这样,lambda 函数将仅被调用一次,您可以选择在重新获取之前控制数据的有效时间。
或者,可以在 API 网关端点之前部署 CloudFront 发行版。主要原因是为了减少延迟,原因如下:
将 CloudFront 与 API Gateway 一起部署的另一个原因是增强的安全功能。目前,AWS Shield Advanced 不支持在 API 网关上启用保护,但支持 CloudFront。
总而言之,最佳实践是将 CloudFront 发行版放置在 API 网关前面,然后对该发行版启用保护。但这取决于您是否想处理另一种服务复杂性只是为了减少对数据库的调用次数。