【问题标题】:What is faster? File_exist or MySQL query?什么更快? File_exist 还是 MySQL 查询?
【发布时间】:2013-01-03 16:14:14
【问题描述】:

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

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

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

  • 我正在考虑为其创建一个 MySQL 表,该表在每次请求时都会被读取,并且如果有玩家记录它会重新创建缓存。
  • 另一种解决方案是在目录中创建一个文件,文件名中包含播放器的 ID。每个请求 PHP 都会检查 file_exist 是否应该清除缓存。

你们会怎么做?它会在每个请求中执行,因此优化这一点非常重要。

【问题讨论】:

  • 将选择数据库选项,在速度方面,良好的数据库架构不会有很大的不同。但这不仅关乎速度,还关乎更好的管理
  • 如果不是非常特殊的情况,您总是会选择数据库。在现实世界中,RMDB 可能比平面文件更快(如果数据已经加载到内存或完整的表适合可用内存。)

标签: php mysql memcached innodb


【解决方案1】:

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

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

此外,APC 或您的 file_exists 解决方案都不会扩展到多个负载平衡服务器——您需要一个 DB 解决方案或 memcached。

【讨论】:

  • 在他们的主页上:“将 APC 用于不经常更改的缓存”,玩家信息实际上变化很大,因为它还包含玩家的游戏统计数据。它还有用吗?
  • @Martin 您可能会在 APC 中对用户缓存进行重大更改时遇到碎片问题。在这种情况下,你最好选择 Memcached。
  • 感谢您的评论。我可能会更好地研究 Memcached。
  • @Martin 不要关闭 memcached——它比看起来容易。如果您使用的是框架,它们中的大多数都有帮助缓存库来连接到 memcached 后端。 PHP 还有一个 memcached 库,如果您不在框架中,您可以使用它。大部分工作只是安装 memcached 服务器并将其设置为作为自己的进程运行。
  • @Martin 另外,请确保查看 memcached 而不是 memcache。两者都作为 php 模块存在,并且是 2 种不同类型的 memcache 服务器。
【解决方案2】:

您公开它的方式与一个与另一个相比有多快,SESSION 方法由于您的并发问题而无效。

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

【讨论】:

    【解决方案3】:

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

    CREATE TABLE t (i INT) ENGINE = MEMORY;
    

    【讨论】:

      猜你喜欢
      • 2019-05-21
      • 2014-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-15
      • 1970-01-01
      • 2011-06-11
      • 1970-01-01
      相关资源
      最近更新 更多