【问题标题】:File based cache or many mysql queries基于文件的缓存或许多 mysql 查询
【发布时间】:2020-01-17 04:38:22
【问题描述】:

假设您正在开发一个多人游戏,其中数据存储在 MySQL 数据库中。例如物品、属性、buff、npc、任务等的名称和描述文本。

那个数据:

  • 不会经常改变
  • 经常被请求
  • 在服务器端是必需的
  • 并且无法在本地缓存(JSON、Javascript)

为了解决这个问题,我编写了一个基于文件的缓存系统,它在服务器上创建 .php 文件并按照预定义复制 整个 mysql-tables php 变量放入其中。

像这样:

$item_names = Array(0 => "name", 1 => "name");
$item_descriptions = Array(0 => "text", 1 => "text");

该文件包含大量数据,最终大小约为 500 KB,然后在每个用户请求时加载。

这是避免不必要查询的好尝试吗?考虑到 查询缓存在 MySQL 8.0 中已被弃用?还是只使用单个查询获取所需的数据更好,即使每个请求最终有数百个数据?

【问题讨论】:

  • 只需创建表 InnoDB,并将 InnoDB buffer pool size 增加到大约。 70% 的服务器 RAM。您将获得与缓存几乎相同的效果,因为经常使用的页面将在 RAM(缓冲池)中
  • 使用 InnoDB。时期。句号。继续解决其他问题。

标签: php mysql performance caching


【解决方案1】:

我建议您使用某种 PSR-6 兼容缓存系统(也可以是文件系统),稍后当您的请求增长时,您可以轻松换出性能更高的缓存,例如 PSR-6 Redis 缓存。

PSR-6 compatible file system cache 的示例。

更多关于PSR-6 Caching Interface的信息

【讨论】:

    【解决方案2】:

    您可以使用Redis,而不是创建自己的缓存机制,因为它将处理您的所有缓存要求。

    这将很容易实现。

    点击链接了解更多关于 Redis 的信息

    REDIS

    REDIS IN PHP

    REDIS PHP TUTORIALS

    【讨论】:

      【解决方案3】:

      根据我的经验...

      只有当您可以证明自己有问题并且知道问题出在哪里时,您才应该优化性能。

      这意味着在实践中,您应该编写负载测试以在“合理的最坏情况”负载下运行您的应用程序,并检测您的应用程序以便了解其性能特征。

      在没有负载测试框架的情况下进行任何类型的优化意味着您是在本能地编码;你可能会在不知不觉中让事情变得更糟。

      您的解决方案 - 将整个表缓存在数组中 - 意味着每个 PHP 进程都将数据加载到内存中,这可能会或可能不会成为性能损失(您知道哪个请求会需要哪些数据?)。看起来您将在 PHP 中执行大量关系逻辑(在您的示例中,将 item_name 粘合到 item_description)。这是 MySQL 真正擅长的;你的 PHP 代码在连接时很容易比 MySQL 慢。

      那么你就有了缓存失效的问题——如何以及何时刷新缓存数据?刷新数据时应用程序的行为如何?我已经看到在刷新缓存数据时网站的爬行速度很慢。

      简而言之 - 这是一个复杂的决定,没有明显的正确/错误答案。我的第一个建议是“构建一个测试框架,这样你就可以根据证据来接近性能”,我的第二个建议是“不要自己动手——考虑使用具有内置缓存支持的 ORM”,我的第三个建议是“考虑使用类似的东西Redis 或 memcached 来存储你的缓存信息”。

      【讨论】:

        【解决方案4】:

        有许多可能的解决方案,取决于您的要求。可能的解决方案是:

        • 基于文件的 JSON 格式缓存。从数据库中检索的数据将在程序处理之前保存到文件中以供下次使用。
        • 内存基础缓存,如 Memcached、APC、Redis 等。与之前的解决方案类似,性能更好,但需要更多集成代码。
        • 基于内存的数据库,如NoSQL、MongoDB等。是基于内存的数据库。
        • 多台数据库服务器,一个主写数据库和多个从读数据库,服务器之间有同步。

        快速并最小化代码更改,我建议使用选项 B。

        【讨论】:

          猜你喜欢
          • 2016-01-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-09-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-06-25
          相关资源
          最近更新 更多