Azure Redis缓存数据丢失?

时间:2014-08-28 11:38:10

标签: node.js azure azure-redis-cache

我有一个Node.js应用程序,它通过Websocket连接接收数据,并将每条消息推送到Azure Redis缓存。它将持久的消息数组存储在变量中供下游使用,并定期从缓存中同步该数组。有点复杂,但是稍后我想将从其中读取的一半写入缓存的应用程序的一半分离出来。

格林威治标准时间02:00左右,基于Azure门户统计数据,我似乎已经开始在同步上获得“缓存未命中”,这持续了几个小时才开始在05年左右再次获得“缓存命中率” :00

缓存未命中对应于CPU使用率的突然增加,其在05:00左右达到峰值。当我说峰值时,我的意思是它达到81%,而之前的最高值约为6%。

所以在05:00左右,CPU达到峰值,然后恢复正常,“缓存未命中”消失,但看着缓存内存的使用情况,我从大约37.4mb下降到使用了大约3.85mb(其中我怀疑是“空”状态,并且该应用程序正在使用的列表已被清空。

应用程序针对缓存运行的唯一函数是LPUSH和LRANGE,没有任何东西可以删除数据,如果有人想知道,当CPU增加内存使用时没有那么没有什么可以去表明流氓添加的数据出现了。

这只是基本计划,所以我不希望它是无懈可击或任何东西,但即使没有标准计划的复制功能,我原本预计它不会完全擦除自己 - 我的印象是Redis会定期将自己写入磁盘,并在从错误中恢复时从中恢复。

所有这些都是我的询问方式:

  1. 有人知道这里可能发生了什么吗?

  2. 如果这是其他人不小心触发自己的东西,那么我应该注意到的任何问题,我可能会在其他应用程序中使用相同的缓存,这可能导致它失败,所以灾难性地

  3. 我会欢迎一大群人告诉我标准计划不会受到这类问题的影响,因为我已经为它做了分析,感觉这是对的很好调用

  4. 非常感谢...

3 个答案:

答案 0 :(得分:2)

在这里我的想法:

Azure Redis缓存将信息存储在内存中。默认情况下,它不会保存"备份"在磁盘上,因此,您在内存中有信息,由于某种原因服务器重新启动而您丢失了数据。

PS:看到这个反馈,没有选项可以使用azure-redis缓存在磁盘上保留信息http://feedback.azure.com/forums/169382-cache/suggestions/6022838-redis-cache-should-also-support-persistence

答案 1 :(得分:2)

  1. 确保您不使用基本计划。基本计划并不认为SLA和我的经验不会经常丢失数据
  2. 标准计划提供SLA并使用2个Redis缓存实例。它非常稳定,并没有丢失我们的数据,尽管这种情况仍然存在。
  3. 现在,如果您要将Azure Redis用作数据库,而不是缓存,则需要使用数据持久性功能,该功能已在Azure Redis缓存高级层中提供:https://azure.microsoft.com/en-us/documentation/articles/cache-premium-tier-intro(请参阅Redis数据)持久性)

答案 2 :(得分:0)

James,使用Standards实例应该可以为您提供更好的可用性。

使用基本层任何Azure Fabric更新到主节点(或硬件故障),都会导致您丢失所有数据。

Azure Redis缓存不支持持久性(写入磁盘/ blob),即使在标准层中也是如此。但是标准层确实为您提供了一个复制的从属节点,如果您的主节点关闭,它可以接管。