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