8

(A) 缓存在 $_SESSION 数组中的每个页面加载时使用的数据是否“更好”(更高效、更快、更安全等)(但仍在查询表以获取重新加载数据的标志),或(B)每次都从数据库中加载它?

我正在使用缓存方法(A),但我担心有数百个用户,内存可能会成为问题?这只是简单的数据,例如名字、姓氏、生日等。

无论使用哪种方法,都会有一个查询正在运行。想法?

4

2 回答 2

6

如果您的数据在每个页面上都使用,并且对所有用户都相同,我不会将其缓存在 $_SESSION 中(这意味着为每个用户拥有该数据的不同副本),而是使用另一种机制,例如:

  • 文件
  • 在内存中,例如使用 APC(如果只有 1 个服务器)
  • 在内存中,例如使用 memcached(如果您有多个服务器)
  • 如果您的数据需要长时间计算或获取多个数据库查询,则将其缓存在数据库中可能是另一种可能性(意味着只有 1 个查询可以取回,并且计算量更少)


如果每个用户的数据都不相同(在您的情况下似乎就是这种情况,因为您正在缓存姓名、生日等)

  • 我会确保我只缓存必要的东西
  • 一旦您只有少量数据要缓存,将其放入会话中应该是可以的
  • 如果你真的有这么多用户,你可能会遇到一些其他的可伸缩性问题,并且很可能会使用 memcached 之类的东西;这意味着您将有其他一些缓存方式;-)

作为旁注:如果您一遍又一遍地执行相同的查询,您的数据库服务器应该自己缓存它(对于 MySQL,它会进入“查询缓存”);所以,我想它不会像你想象的那么糟糕——即使没有那么优化^^

于 2009-09-07T04:59:33.497 回答
1

这取决于您的会话处理程序是什么。您的会话处理程序可能是 MySQL,因此问题不是哪个更好,而是如何优化您的会话处理。

默认的 PHP 会话处理程序是文件,但可以很容易地更改为 mysql。

如果您谈论的是非用户特定数据,那么只需将其保存到数据库即可。如果以后遇到问题,请担心优化。使用更好的设计模式通常比事先考虑优化更有益。设计您的代码,以便您可以轻松地使用不同的处理程序进行存储,并且以后不会出现优化问题。

如果它是特定于用户的,请使用会话,但如有必要,请使用适当的会话处理程序。

于 2009-09-07T07:53:16.317 回答