在 MySQL 插入之前临时存储数据


store data temporarily before mysql insert

我认为您可以打开的mysql连接数量是有限制的。有没有办法暂时存储来自用户的数据,然后将其一次性插入数据库?否则你怎么管理20万人进行Facebook状态更新?(因为我不这样做,你可以简单地打开 200k 连接并输入信息。

谢谢。

例如,您可以使用队列,单个进程通过该队列获取 INSERT(通过进程间通信或通过套接字,即使在这种情况下,您将有 200.000 个连接到队列服务器,或者通过将文件存储到"假脱机"目录中)。

然后进程"收获"队列,在MySQL的情况下可能使用扩展语法合并INSERTS,并将它们发送到数据库。

这只有在将 INSERT 外包给流程的整个工作比将其发送到 DB 快得多时才有用,否则成本和问题(例如,在外包之后,Web 服务器认为数据库已更新,但实际上并非如此,并且在收割者到达它之前不会(一点点?)时间)超过收益。

如果收割者进程能够在过载的情况下限制或停止 Web 服务器,则可以使整个过程更具弹性:即,假设 MySQL 每分钟只能处理 X 次插入,即使有插入延迟等,入站速率也不止于此。然后在每次迭代时,收割者进程都会注意到队列变长了。超过给定限制,进程可能会设置一个标志,以便新用户收到错误消息并阻止生成进一步的插入。

在入站>出站的情况下,无论如何都会给出一些东西,所以至少通过这种方式可以保护现有连接并提供"软故障"模式。

你也可以使用共享内存实现本地缓存:每个PHP进程将INSERTS放在共享内存中(带锁定!如果等待的元组超过 X 个,或者较旧的元组早于 Y 秒,则所有元组将合并到发送到 MySQL 的单个 INSERT 中,并清空缓存。这样,整个过程非常轻量级,不使用网络(但有一点内存),并且MySQL上的负载明显减少 - 合并的INSERT可以比单独的INSERT快100倍,并且还可以使用索引禁用/启用技巧。