将数据库结果集存储在用户会话中是否合理/负责任的想法,而不是在每次加载页面时从数据库中新加载数据库结果集?我知道在服务器上的缓存文件中缓存生成的HTML代码的可用性,但我认为这有太多的便利问题。
例如,在购物页面上,主导航中的品牌标签有一个下拉菜单,其中列出了当前在网站上有产品的所有品牌。查询已经过优化,但仍然需要在每次加载页面时运行。而不是这样做我想将结果集保存在用户的会话中,因此每个会话只加载一次品牌。
或者,我可以为subnav生成HTML代码并将其存储在服务器上的缓存文件中。如果在会话中存储阵列的想法不利于服务器的性能,我可能会看到过去的便利问题。
感谢您的帮助!
答案 0 :(得分:3)
是否有任何理由不能使用像Memcached这样的传统缓存,而不是试图将其插入会话?
以这种方式使用会话缓存的问题是它会造成混乱。会话数据应尽可能保持精简,因为它会在每个请求中加载。倾倒大量数据可能会严重拖累业绩。
在会话中存储内容似乎总是“方便”,但除非它与会话本身严格相关,否则最好避免使用。
答案 1 :(得分:3)
是的,这是合理的,建议缓存不经常更改的数据。最快的SQL查询是您根本不运行的查询。
一个棘手的问题是决定何时刷新数据的缓存版本。关于这一点有一句名言:
“计算机科学中只有两个难题:缓存失效和命名事物。” - Phil Karlton
至于使用会话,我同意@ tadman的回答,会话不一定是这类数据的最佳位置。还有其他选项,包括您提到的缓存文件,以及memcached或APC等内存缓存。
答案 2 :(得分:1)
在这种情况下,我建议去Memcached。
设置说明&配置可以在这里找到:https://www.digitalocean.com/community/articles/how-to-install-and-use-memcache-on-ubuntu-12-04(请注意这个是Ubuntu,但它会给你一个好主意)
答案 3 :(得分:-1)
其他人建议使用Memcached。它增加了复杂性并需要RAM(因此如果它们在同一台服务器上运行,它会使MySQL变得更慢)。它可能是最适合您的解决方案,但由于我不知道任何“对每个人都有好处”的解决方案,而且由于我不知道您的工作量,我只是建议替代方案。
是的,MySQL查询缓存有很多问题。但它可能对你有好处。
MEMORY表也可以是一个很好的解决方案,如果你没有太多东西需要缓存。
在会话数据中存储缓存可能比根本不缓存更糟糕,因为每个用户的数据都是重复的,只有在会话过期时才会进行清理。不要那样浪费你的记忆。