为什么我的Redis密钥在存储后只出现几分钟?

时间:2015-08-29 20:36:11

标签: heroku redis aws-lambda

我在AWS Lambda上有一个处理函数,它连接到Redis实例以在缓存中存储单个密钥。该功能已成功完成,但Redis中的键显示事后几分钟(或更多)。

Heroku RedisRedis Cloud都可以观察到这种行为,它们都是托管解决方案。

我不能为我的生活找出造成这种滞后的原因。我的Redis知识几乎为零,我知道如何使用LPUSH存储列表以及如何使用LTRIM修剪该列表。

当我在本地计算机上使用redis-cli观察滞后时,Redis的编写者使用this Node client

在我描述的设置中遇到这种缺乏是否常见?我该怎么做才能调试这个?

2 个答案:

答案 0 :(得分:1)

我故意忽略了问题中的大部分信息,并且只想提到所谓的症状,即

  

密钥在存储后仅显示几分钟

Redis无法实现此行为 - 在Redis设计的情况下,对数据的任何更改都会立即显示。也就是说,您所描述的唯一可能是远程可能的情况是当您写入Redis主服务器并从非常滞后的从属服务器进行读取时。我可以向您保证,但Redis Cloud并非如此。

答案 1 :(得分:-1)

主要原因是Lambda容器在函数终止后立即开始睡眠,而您使用的Redis客户端都是异步API。

  

请注意,API是完全异步的。要从服务器获取数据,您需要使用回调。

我假设异步SET是Lambda函数中执行的最后一个操作。一旦调用它,底层的Lambda容器就会进入休眠状态,而且很可能实际的SET动作还没有完成它的工作。因此,在调用完全相同的Lambda容器以再次执行您的函数并完成上次执行时应该完成的作业之前,记录将不会显示在Redis中。这可能是您遇到的 lag

要测试是否为真,请在函数结束时执行几秒钟的睡眠操作以延迟Lambda容器立即进入睡眠状态,并查看 lag 是否为还在那里。

我还建议不要在Lambda函数中使用异步行为API。他们会将状态添加到您的Lambda计算中,这实际上也不是AWS自己在Lambda文档中推荐的。