Node.js Redis数据丢失
我们正在将Node.JS与Redis结合使用,我们遇到了数据丢失问题。 我们有统计数据收集系统,所以我们必须收集处理到服务器的每个请求。 对于高并发请求(平均1000/秒),我们在Redis中存在数据丢失问题 我们在Node.JS和Redis中记录了每个请求,问题是Node.JS显示的请求量与发送的请求量完全相同,Redis Monitor调试的请求量相同,但Redis DBSIZE向我们显示的值不正确。它总是比预期少约40%-50% 我们的服务器配置为: Intel® Core™ i7-920 24 GB DDR3 RAM From Hetzner 我们的“平均负载”为0.04,还有大量可用内存(~20gb)Node.js Redis数据丢失,node.js,redis,data-loss,Node.js,Redis,Data Loss,我们正在将Node.JS与Redis结合使用,我们遇到了数据丢失问题。 我们有统计数据收集系统,所以我们必须收集处理到服务器的每个请求。 对于高并发请求(平均1000/秒),我们在Redis中存在数据丢失问题 我们在Node.JS和Redis中记录了每个请求,问题是Node.JS显示的请求量与发送的请求量完全相同,Redis Monitor调试的请求量相同,但Redis DBSIZE向我们显示的值不正确。它总是比预期少约40%-50% 我们的服务器配置为: Intel® Core™ i7-920
我们将非常感谢您对此问题提供的任何帮助。您确定,
DBSIZE
应该返回所有密钥吗?您是否使用键
命令尝试过相同的操作
编辑:
这可能也有帮助。
第一步是查看有关内存管理的Redis配置。 根据maxmemory和maxmemory策略参数的值,Redis可以从内存中逐出对象。您可能需要检查maxmemory条目是否已注释掉,并且maxmemory策略是否未设置为allkeys-* 然后还应该检查Node.js代码。Node.js是异步的,它可以在处理来自Redis的相应ack数据包之前将大量项目推送到Redis。代码应设计为在某个点限制客户端命令队列中的项目数。您可以计算并比较已发送命令的数量与回复的数量(通过定义回调来计算),以检查这一点
最后,您可能还希望使用Redis命令检查真正发送到Redis服务器的所有通信量是否确实已存储。它可能有助于评估问题是在服务器端还是客户端。KEYS命令返回的数字与DBSIZE相同,但不正确。我想我发现Node.JS确实是问题所在,或者更准确地说,Node.JS redis driver,Node\u redis。我们已经转移到了mysql内存,它确实提供了相当好的结果。
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