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

时间:2012-07-06 13:20:54

标签: php mysql

我认为您可以打开的mysql连接数量有限制。是否有办法临时存储用户的数据,然后将其插入到数据库中?或者你怎么管理说20万人在facebook状态更新? (因为我不能简单地打开200k连接并将信息输入。)

感谢。

1 个答案:

答案 0 :(得分:1)

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

然后,进程“收缩”队列,可能在MySQL的情况下使用扩展语法合并INSERTS,并将它们发送到DB。

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

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

在入站>出站情况,无论如何都会给 ,所以至少这样你就可以保护现有的连接并提供“软故障”模式。

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