3

我有一个 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 回答 3

2

这里是我的想法:

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

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

于 2014-08-28T22:10:07.513 回答
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 数据持久性)
于 2016-02-19T08:51:38.827 回答
0

James,使用标准实例应该可以大大提高可用性。

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

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

于 2014-09-02T21:20:45.223 回答