php - 同时调用 Memcache

标签 php mysql caching memcached high-load

几天前我参加了中/高级 PHP 开发人员的面试(我失败了)。我被问到这个棘手的问题仍然困扰着我。

假设我们使用 PHP + Memcached 并且项目负载非常大(大约每秒 100 次点击或更多)。我们要执行大量 SQL 查询,因此我们决定将其缓存在 Memcached 中。现在缓存已经过期,我们需要再次执行那个巨大的查询来缓存它,但问题是所有 100 个用户同时访问网站,所以理论上服务器会进行 100 次 SQL 查询同时缓存它,所以我认为服务器会宕机。

我们如何解决这个问题?我认为查询应该执行一次,另外 99 个人应该留下来等待 Memcached 中存在的数据。

最佳答案

We have huge SQL query to perform,

多久(假设每小时一次?)。 需要多长时间(假设 30m)

首先,任何人(客户端、服务器、php、用户)都不应该触发使查询发生的事件。您不希望前端有任何与服务页面请求阻塞有关的内容。

相反,您在后台、线程、另一台机器、cron 作业中执行查询(例如:每 1 小时运行一次查询以提供最新结果)。查询完成后,您可以在系统运行的同时写入内存缓存。

这样,没有页面请求会导致查询触发(并因此阻塞),此外,您可以稳定/一致地处理之前的 100 个请求。

此外,您不会在 mysql 中执行 100 个查询副本。它会并行执行一些(阻塞其余部分),但其他 90~ 查询将全部命中 sql 查询缓存,因此它实际上不会运行查询 100 次。

无论如何,我怀疑你是否愿意在这个地方工作。

希望这是有道理的!

关于php - 同时调用 Memcache,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28514512/

相关文章:

php - PHP中的htmlentities但保留html标签

php - 在 Woocommerce 中选择的运输方式更改时显示或隐藏 html 元素

php - 如何使用 PHP 7 启用 MySQL

caching - Nginx 内容缓存导致 Docker 内存峰值

javascript - 如何在 onclick 中添加 fontawesome 微调器?

php - 模块 Controller 重定向到 404 Prestashop

PHP 脚本没有执行我的语句

php - 如何使用 MySQL/PHP 对数据库结果进行排序和显示

java - tomcat 5.5响应头缓存

c++ - 线程本地内存,使用 std::string 的内部缓冲区作为 c 风格的临时内存