node.js - Redis 数据丢失

标签 node.js redis data-loss

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

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

我们的服务器配置是:

Intel® Core™ i7-920
24 GB DDR3 RAM
From Hetzner

We are running Debian Squeeze, here is our 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)。

非常感谢有关此问题的任何帮助。

最佳答案

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

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

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

关于node.js - Redis 数据丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9512974/

相关文章:

javascript - 在 Node js 中运行 powershell 脚本?

java - 有时会出现 "NOAUTH Authentication required"错误

javascript - 如何在 express.js 中呈现 redis 记录?

symfony - FOSUserBundle - Redis 中的用户实体

node.js - 部署后Nodejs将不会在Heroku上启动

javascript - 在 Node.js 的回调周围放置返回值

node.js - 平均堆栈 : How to handle internationalization in front end error messages?

git (sourcetree) 返回未被推送且意外为 'reversed' 的提交

Android SQLite升级不丢数据

c++ - 字符串数据似乎在 for 循环后被删除