如何在PHP中实现后台/异步写后缓存?

cle*_*tus 5 php mysql caching

我有一个特定的PHP页面,由于各种原因,需要将〜200个字段保存到数据库中.这些是200个单独的插入和/或更新语句.现在显而易见的事情是减少这个数字但是,就像我说的那样,由于我不打算进入的原因我不能这样做.

我没想到会遇到这个问题.在MySQL中选择似乎合理的性能但是插入/更新不是(执行此更新需要大约15-20秒,这自然是不可接受的).我编写了Java/Oracle系统,可以同时快乐地进行数千次插入/更新(在两种情况下都运行本地数据库; MySQL 5与OracleXE).

现在,在Java或.Net之类的东西中,我可以轻松地执行以下操作之一:

  1. 将数据写入内存中的后写缓存(即它将知道如何持久保存到数据库并且可以异步执行);
  2. 将数据写入内存缓存并使用PaaS(持久性即服务)模型,即缓存的监听器将持久保存字段; 要么
  3. 只需启动可以保留数据的后台进程.

最小的解决方案是拥有一个我可以简单更新的缓存,它将在它自己的时间内单独地升级和升级数据库(即它将在​​更新内存缓存后立即返回).这可以是全局缓存或会话缓存(尽管全局共享缓存在其他方面具有吸引力).

解决这类问题的其他方法是什么?

Mar*_*rkR 3

您应该能够相对较快地执行 200 次插入,但这取决于很多因素。如果您使用事务引擎并在自己的事务中执行每个引擎,请不要这样做 - 这会产生太多的 I/O。

如果您使用非事务性引擎,那就有点棘手了。使用单个多行插入可能会更好,因为 MySQL 的刷新策略意味着它不需要在每行之后刷新其更改。

您确实希望能够在生产规格的开发盒上重现这一情况,并准确分析其发生的原因。停下来应该不难。

当然,另一种可能性是,由于极大大小的表或大量索引,您的插入速度很慢 - 在这种情况下,您应该适当地扩展数据库服务器。将大量行插入到索引不适合 RAM 的表中(或者 RAM 没有正确配置为用于缓存这些索引)通常会变得非常糟糕。

但是,当有一种方法可以轻松地改变应用程序并保持当前算法时,不要试图寻找一种使应用程序复杂化的方法。