【问题标题】:Store MySQL set result in PHP session array to lessen database lookups将 MySQL 设置结果存储在 PHP 会话数组中以减少数据库查找
【发布时间】:2013-04-24 15:51:42
【问题描述】:

将数据库结果集存储在用户会话中,而不是在每次页面加载时从数据库中重新加载它是一个合理/负责任的想法吗?我知道在服务器上的缓存文件中缓存生成的 HTML 代码的可用性,但在我看来这有太多的便利问题。

例如,在购物页面上,主导航中的品牌标签有一个下拉菜单,其中列出了网站上当前有产品的所有品牌。查询已经过优化,但它仍然必须在每次页面加载时运行。而不是这样做,我想将结果集保存在用户的会话中,因此每个会话只加载一次品牌。

或者,我可以为 subnav 生成 HTML 代码并将其存储在服务器上的缓存文件中。如果将数组存储在会话中的想法对服务器的性能没有好处,那么我可能会看到过去的便利问题。

感谢大家的帮助!

【问题讨论】:

  • 而不是将数据缓存到会话您应该使用memcache 或一些简单的文件系统缓存 - 因此将数据存储到将被刷新的文件中,例如每 10 分钟一次。然后,您的简单缓存将只从文件中读取序列化数据,或者如果文件太旧则刷新文件......嗯?

标签: php mysql arrays performance session


【解决方案1】:

您有什么理由不能为此使用像 Memcached 这样的传统缓存,而不是尝试将其塞入会话中?

以这种方式使用会话缓存的问题是它会造成混乱。会话数据应尽可能保持精简,因为它会在每个请求上加载。转储大量数据可能会严重拖累性能。

在会话中存储东西似乎总是“方便”,但除非它与会话本身严格相关,否则最好避免。

【讨论】:

  • 好的,这对我来说是有道理的,我担心你会说什么......哦,好吧,那我最好把它缓存起来!我使用 PEAR::Cache
【解决方案2】:

是的,缓存不经常更改的数据是合理的并且建议。最快的 SQL 查询是您根本不运行的查询。

一个棘手的问题是决定何时刷新数据的缓存版本。关于这个有一句名言:

“计算机科学中只有两个难题:缓存失效和命名事物。”
——菲尔·卡尔顿

至于使用会话,我同意@tadman 的回答,会话不一定是此类数据的最佳场所。还有其他选项,包括您提到的缓存文件,以及memcachedAPC 等内存缓存。

【讨论】:

  • 我听说过修改过的一个:“计算机科学中只有两个难题:缓存失效、命名事物和一个错误。”
【解决方案3】:

在这种情况下,我建议选择Memcached

可以在此处找到设置和配置说明:https://www.digitalocean.com/community/articles/how-to-install-and-use-memcache-on-ubuntu-12-04(请注意,此说明适用于 Ubuntu,但它会给你一个好主意)

【讨论】:

    【解决方案4】:

    其他人建议使用 Memcached。它增加了复杂性并需要 RAM(因此,如果它们在同一服务器上运行,它会使 MySQL 慢得多)。它可能是最适合您的解决方案,但由于我不知道任何“适合所有人”的解决方案,并且由于我不了解您的工作量,所以我只是建议替代方案。

    是的,MySQL 查询缓存有很多问题。但这可能对你有好处。

    如果您没有太多要缓存的东西,MEMORY 表也可能是一个很好的解决方案。

    在会话数据中存储缓存可能比根本不缓存更糟糕,因为每个用户的数据都是重复的,并且只有在会话过期时才会进行清理。不要那样浪费你的记忆。

    【讨论】:

    • 除非你能用基准来限定你的陈述,否则我将不得不相信这纯粹是偏执狂。在大多数情况下,在您的条目上使用适当 TTL 的 Memcached 不会成为问题。
    • 80%+ 的内存应该分配给 InnoDB 的缓冲区(我希望我不必在文档中搜索这个语句......)。目的正是避免访问磁盘。当然,在某些情况下,使用 Memcached 会更好。 “这取决于你的工作量”这句话听起来很奇怪吗? :)
    • 您假设只有一台服务器可用,这是一个很大的假设。 Memcached 部署在您的应用服务器上时运行良好,完全不会干扰 MySQL。
    • 但我写过“如果它们在同一台服务器上运行”。我同意,如果 memcached 有一个专用的服务器内存不会有问题。
    • 除非服务器配置错误,否则它仍然没有希望使您的服务器运行速度显着变慢。这是不言而喻的。为什么你以歇斯底里的方式添加这么多还不清楚。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-09
    • 1970-01-01
    • 2018-01-13
    • 1970-01-01
    • 1970-01-01
    • 2013-08-14
    • 2011-07-14
    相关资源
    最近更新 更多