我的数据库中存储了大量有关产品的信息(年份、名称、发布日期、数量等)。我目前将所有产品加载一次并将它们存储在会话变量中 - 目前只有 8 种产品,但随着时间的推移,列表会不断增加。我这样做的原因是为了(也许很愚蠢)节省每次访问产品页面时的硬盘读取次数。我把这些信息存储在会话中是不是在自找麻烦?
答案1
是的,你可能搬起石头砸自己的脚。如果每个用户会话都存储所有产品信息,那么一旦用户和产品数量很多,内存就可能用完。
我建议使用类似 memcached 的东西来缓存针对产品表的查询,这样您就不会对磁盘造成太大的损害,也不会耗尽内存。
但这实际上取决于您预期的规模——如果您的产品数据只有 50kB,同时有 500 个用户会话,那么您只会占用 25MB,而且您可能可以应付。如果您的产品数据有 50MB,同时有 50,000 个用户会话,那么您将使用 2.5TB 的 RAM,而您可能不会有这么多。
答案2
如果您只有 8 种产品,则不需要数据库:-)
如果您想使用数据库(如果网站规模不断扩大,这可能是个好主意),您也可以使用数据库并简单地将会话产品密钥数组指向它。在会话中拥有重复的信息是一件麻烦且不必要的事情——为什么要把它放在两个地方?
如果数据库被频繁访问,那么所有产品表信息很可能都在内存中,因此您无需增加任何复杂性。对于大多数网站来说,memcached 只是一种尝试加速设计非常糟糕的数据库查询或 ORM 的方法。