0

我们将 Node.JS 与 Redis 结合使用,并且遇到了数据丢失问题。我们有统计收集系统,所以我们必须收集处理到我们服务器的每个请求。对于高并发请求(平均 1000/秒),我们在 Redis 中存在数据丢失问题。

我们在 Node.JS 和 Redis 中记录了每个请求,问题是 Node.JS 显示的请求数量完全相同,Redis Monitor 调试的数量相同,但 Redis DBSIZE 向我们显示的值不正确。它总是比预期的少约 40%-50%。

我们的服务器配置是:

英特尔® 酷睿™ i7-920
24 GB DDR3 内存
从赫兹纳

我们正在运行 Debian Squeeze,这是我们的 sysctl:

net.ipv4.conf.all.rp_filter=1
net.ipv4.icmp_echo_ignore_broadcasts=1
net.core.somaxconn = 1280
fs.file-max = 50000
vm.overcommit_memory=1

我们的“平均负载”为 0.04,并且有大量可用内存(~20gb)。

任何有关此问题的帮助将不胜感激。

4

2 回答 2

2

第一步是查看有关内存管理的 Redis 配置。根据 maxmemory 和 maxmemory-policy 参数的值,Redis 可以从内存中驱逐对象。您可能需要检查 maxmemory 条目是否已被注释掉,并且 maxmemory-policy 未设置为 allkeys-*

然后还应该检查 Node.js 代码。Node.js 是异步的,它可以在处理来自 Redis 的相应 ack 数据包之前,将大量项目推送到 Redis。代码应设计为在某些时候限制客户端命令队列中的项目数。您可以统计并比较发送命令的数量与回复的数量(通过定义回调来计算)来检查这一点。

最后,您可能还想使用 Redis 的MONITOR命令来检查所有真正发送到 Redis 服务器的流量是否确实被存储。它可能有助于评估问题是在服务器端还是客户端。

于 2012-03-01T10:32:06.603 回答
0

您确定,DBSIZE应该返回所有密钥吗?您是否尝试过相同的KEYS命令?

编辑:这也可能有帮助。 redis dbsize命令的准确性

于 2012-03-01T09:16:24.737 回答