什么更快? File_exist还是MySQL查询?

时间:2013-01-03 16:14:14

标签: php mysql memcached innodb

我的网页游戏中的用户正在PHP的$ _SESSION中缓存某些播放器信息。 每次加载游戏时都会检查会话是否存在,如果没有,他们会从MySQL数据库中获取玩家信息,然后将其存储在$ _SESSION中。

现在我的问题是,如果玩家信息被另一个进程或玩家更新怎么办?他们无法更新其他玩家的$ _SESSION缓存。

我知道memcached很可能是解决这个问题的方法,但我不确定我是否应该花时间做这样的事情。 $ _SESSION缓存对我来说很好,除此之外。

  • 我正在考虑为它创建一个MySQL表,它可以在每个请求中读取,如果有一个记录,那么它会重新创建缓存。
  • 另一个解决方案是在目录中创建一个文件,该文件名为播放器的id。 PHP的每个请求都会检查file_exist是否应该清除缓存。

你们会做什么?它会在每个请求中执行,因此对此进行优化非常重要。

3 个答案:

答案 0 :(得分:3)

从设计的角度来看,我会避免使用file_exists和目录方法。当然'file_exists'很快,但它不能很好地扩展......如果用户改名,会发生什么?

如果你正在使用APC(你应该),你可以使用APC的用户内存缓存。只要您在单个服务器上,它就应该为您提供与memcached类似的性能优势,而无需单独的内存缓存服务器进程。如果用户条目经常更改,您可能会遇到APC的碎片问题。在这种情况下,有时间咬住子弹并使用memcached - 您甚至可以将会话数据存储在memcached中以提高性能。

此外,APC或您的file_exists解决方案都不会扩展到多个负载均衡的服务器 - 您需要一个数据库解决方案或memcached。

答案 1 :(得分:1)

你暴露它的方式不是关于它与另一个的速度有多快,因为你的并发问题,SESSION方法无效。

如果您的数据可以同时更改,那么您的数据存储需要能够处理该并发性,并且您要使用的任何缓存层都需要根据您的问题的性质进行操作。

答案 2 :(得分:1)

如果它只是关于缓存,而你不想安装memcache(d),你可以在内存中使用mysql表。它没有memcached那么快,但仍然是一个很好的解决方案。并确保在所有表上创建适当的索引(可能这是更好的解决方案,没有缓存,只需从表中选择它)。

CREATE TABLE t (i INT) ENGINE = MEMORY;