Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 同时调用Memcache_Php_Mysql_Caching_Memcached_High Load - Fatal编程技术网

Php 同时调用Memcache

Php 同时调用Memcache,php,mysql,caching,memcached,high-load,Php,Mysql,Caching,Memcached,High Load,几天前,我参加了中高级PHP开发人员的面试(我失败了)。有人问了我一个棘手的问题,这个问题仍然困扰着我 假设我们使用PHP+Memcached和高负载项目(大约每秒100次或更多点击)。我们有庞大的SQL查询要执行,所以我们决定将其缓存在Memcached中。现在缓存已经过期,我们需要再次执行那个巨大的查询来缓存它,但问题是所有100个用户同时进入站点,,所以理论上服务器会同时进行100次SQL查询以缓存它,所以我想服务器会停机 我们如何解决这个问题?我认为查询应该执行一次,另外99个人应该留下

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

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

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

我们需要执行大量的SQL查询

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

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

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

通过这种方式,没有页面请求导致查询触发(从而阻塞),此外,您可以稳定/一致地处理以前处理的100个请求

此外,您不会在mysql中执行100个查询副本。它将并行执行一些查询(阻塞其余的查询),但其他90个查询都会命中sql查询缓存,因此它不会真正地运行查询100次

我怀疑你是否愿意在这里工作

希望这是有道理的

我们需要执行大量的SQL查询

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

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

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

通过这种方式,没有页面请求导致查询触发(从而阻塞),此外,您可以稳定/一致地处理以前处理的100个请求

此外,您不会在mysql中执行100个查询副本。它将并行执行一些查询(阻塞其余的查询),但其他90个查询都会命中sql查询缓存,因此它不会真正地运行查询100次

我怀疑你是否愿意在这里工作


希望这是有道理的

我的选择是添加一个额外的缓存状态(例如“stale”),以标记已过期且处于更新状态的缓存项

因此,如果php进程从memcached请求缓存数据,并发现其状态为“过期”,它会将状态设置为“过时”,从数据库中获取一个新版本,并将其作为“有效”存储在memcached中

如果另一个php进程访问状态为“stale”的缓存数据,它将简单地使用stale版本,但不会从数据库中获取新版本


现在,如果您想挤出最后一点性能,第一个php进程本身不会获取新数据,而是将此任务委托给另一个实例(例如rabbitmq),并返回陈旧数据。

我的选择是添加一个额外的缓存状态(“陈旧”)标记已过期且处于更新状态的缓存项

因此,如果php进程从memcached请求缓存数据,并发现其状态为“过期”,它会将状态设置为“过时”,从数据库中获取一个新版本,并将其作为“有效”存储在memcached中

如果另一个php进程访问状态为“stale”的缓存数据,它将简单地使用stale版本,但不会从数据库中获取新版本


现在,如果您想挤出最后一点性能,第一个php进程本身不会获取新数据,而是将此任务委托给另一个实例(例如rabbitmq),并返回陈旧的数据。

这似乎很合理。但我不明白该把身份放在哪里?在哪里存储过时的结果?我以为Memcached只是在过期时清除条目。顺便说一句,多亏了Rabbitmq上的提示,我现在还不知道这样的程序。我要仔细阅读手册,因为现在我对它的工作方式已经看得很模糊了。不要使用memcache ttl。将到期日期和缓存状态存储在一个单独的memcache条目中。这似乎很合理。但我不明白该把身份放在哪里?在哪里存储过时的结果?我以为Memcached只是在过期时清除条目。顺便说一句,多亏了Rabbitmq上的提示,我现在还不知道这样的程序。我要仔细阅读手册,因为现在我对它的工作方式已经看得很模糊了。不要使用memcache ttl。将到期日期和缓存状态存储在一个单独的memcache条目中。查询不是很难,我认为执行该查询大约需要10秒,但在某些情况下可能会导致服务器崩溃。无论如何,你的想法很好,我认为,crontab是一个很好的解决方案。谢谢。不是很难查询,我想执行大约需要10秒,但在某些情况下可能会使服务器崩溃。无论如何,你的想法很好,我认为,crontab是一个很好的解决方案。谢谢