3

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

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

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

感谢所有的帮助!

4

4 回答 4

3

有什么理由你不能使用像Memcached这样的传统缓存而不是试图将它塞进会话中?

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

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

于 2013-04-24T15:54:23.980 回答
3

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

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

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

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

于 2013-04-24T16:00:53.253 回答
1

在这种情况下,我建议使用Memcached 。

在此处输入图像描述

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

于 2013-04-24T16:02:08.830 回答
-1

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

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

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

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

于 2013-04-24T16:09:29.530 回答