Php 在mysql插入之前临时存储数据
我认为您可以打开的mysql连接数量是有限制的。有没有一种方法可以暂时存储用户的数据,然后一次性插入数据库?或者你会如何管理20万人更新facebook状态?(因为我不知道,你只需打开20万个连接并将信息输入即可。)Php 在mysql插入之前临时存储数据,php,mysql,Php,Mysql,我认为您可以打开的mysql连接数量是有限制的。有没有一种方法可以暂时存储用户的数据,然后一次性插入数据库?或者你会如何管理20万人更新facebook状态?(因为我不知道,你只需打开20万个连接并将信息输入即可。) 谢谢。例如,您可以使用一个队列,通过该队列,单个进程可以获得插入(通过进程间通信,或者通过套接字,即使在这种情况下,您有200.000个到队列服务器的连接,或者通过将文件存储到“spool”目录) 然后,进程“重新获取”队列,在MySQL中可能使用扩展语法合并插入,并将它们发送到D
谢谢。例如,您可以使用一个队列,通过该队列,单个进程可以获得插入(通过进程间通信,或者通过套接字,即使在这种情况下,您有200.000个到队列服务器的连接,或者通过将文件存储到“spool”目录) 然后,进程“重新获取”队列,在MySQL中可能使用扩展语法合并插入,并将它们发送到DB 这只有在将INSERT外包到流程中的整个工作比将其发送到DB快得多的情况下才有用,否则成本和问题(例如,外包后,Web服务器认为DB已更新,但实际上没有更新,而且在收割者到达之前(一小会儿?)不会更新)超过好处 如果reaper进程能够在过载的情况下限制或停止Web服务器,那么您可以使整个进程更具弹性:例如,假设MySQL每分钟只能处理X个插入,即使插入延迟等等,并且入站率也高于此。然后在每次迭代中,收割者进程都会注意到队列正在变长。在给定的限制范围内,进程可能会设置一个标志,以便新用户收到错误消息并阻止生成进一步的插入 在inbound>outbound的情况下,无论如何都会出现一些问题,所以至少这样可以保护现有连接并提供“软故障”模式
您还可以使用共享内存实现一个本地缓存:每个PHP进程都将插入内容放在共享内存中(带有锁定!)。如果有超过X个元组等待,或者如果较旧的元组早于Y秒,则所有元组将合并到一个发送到MySQL的插入中,缓存将清空。通过这种方式,整个过程非常轻量级,不使用网络(但占用一点内存),MySQL上的负载明显减少-合并插入比单独插入快100倍,还可以使用索引禁用/启用技巧。您可以同时打开200000个连接,同时执行200000个提交。它可能有点慢,但它可以工作。如果你有20万用户,你必须积极使用缓存。所以,您可以在写入数据库之前将数据保存在缓存中。这也将有助于提高性能。否则,您只需打开那么多连接即可。查看此项了解更多信息-在您的示例中,您将缓存200000个更新,这样您可能会耗尽RAM,而不是耗尽连接。运行一个同时有200000个更新的站点不仅仅是让一个站点做一个更新,然后让200000个用户运行它。不要计划得太远。。。