我们将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
我们正在运行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)。
对此问题的任何帮助都将受到高度赞赏。
答案 0 :(得分:2)
第一步是查看有关内存管理的Redis配置。 根据maxmemory和maxmemory-policy参数的值,Redis可以从内存中逐出对象。您可能想要检查maxmemory条目是否已注释掉,而maxmemory-policy未设置为allkeys - *
然后还应该检查Node.js代码。 Node.js是异步的,它可以在处理来自Redis的相应ack数据包之前将大量项目推送到Redis。代码应设计为在某个时刻限制客户端命令队列中的项目数。您可以计算并比较发送的命令数和回复数(通过定义回调计算)来检查这一点。
最后,您可能还想使用Redis的MONITOR命令来检查是否确实存储了真正发送到Redis服务器的所有流量。评估问题是在服务器端还是客户端可能有帮助。
答案 1 :(得分:0)
您确定DBSIZE
应该返回所有密钥吗?您是否尝试过KEYS
命令?
编辑: 这也可能有所帮助。 Accuracy of redis dbsize command