7

我意识到这可能是一个模糊的问题,留下了一个模糊的答案,但我需要一些真实世界的示例、想法和/或最佳实践来缓存 Web 应用程序的数据。我读过的所有示例本质上都更具技术性(如何从相应的缓存存储中添加或删除缓存数据),但我无法找到更高级别的缓存策略。

例如,我的 Web 应用程序为每个用户提供了一个收件箱/邮件功能。到目前为止,我一直在做的是将典型的会话数据存储在缓存中。在此示例中,当用户登录时,我会转到数据库并检索用户的邮件消息并将它们存储在缓存中。我开始怀疑我是否应该一直在缓存中维护所有用户消息的副本,并在需要时从缓存中检索它们,而不是在登录时从数据库中加载。我有一堆在登录时加载的其他数据(产品目录和相关实体),登录开始变慢。

所以我想我向社区提出的问题是,在这种情况下,你会做什么/推荐什么方法?

谢谢。

4

2 回答 2

6

这可能更适合https://softwareengineering.stackexchange.com/,但通常您希望缓存:

  • 不经常更改的元数据/配置数据。例如国家/州列表、外部资源地址、逻辑/分支设置、产品/价格/税收定义等。
  • 检索或生成成本高昂且不需要经常更改的数据。例如报告的历史数据集。
  • 当前用户会话独有的数据。

上面的最后一项是您需要小心的地方,因为您可以通过为每个活动会话添加几兆字节的数据来大幅增加应用程序的内存使用量。它还意味着不同级别的缓存——应用程序范围、用户会话等。

通常,您不应缓存处于活动更改中的数据。

在较大的系统中,您还需要考虑缓存的位置。是否可以有一个中央缓存服务器,或者每个服务器/进程处理自己的缓存是否足够好?

另外:您应该有一些方法来快速重置/使缓存数据无效。对于较小或任务关键性较低的应用程序,这可能就像重新启动 Web 服务器一样简单。对于我工作的大型系统,我们对大多数缓存数据使用 12 小时的绝对过期窗口,但如果需要,我们可以强制立即过期。

这是一个非常广泛的问题,答案很大程度上取决于您正在构建的特定应用程序/系统。我对您的具体情况知之甚少,无法说明您是否应该缓存所有用户的消息,但直觉上这似乎是个坏主意,因为您似乎正在有效地缓存整个数据集。如果有新消息进入或被删除,这可能会导致问题。然后你会在缓存中更新它们吗?这不是简单地复制后备存储吗?

缓存只是一种性能优化技术,与任何优化一样,在进行实质性更改之前先进行测量,以避免浪费时间优化错误的东西。也许您不需要太多缓存,它只会使您的应用程序复杂化。也许您正在考虑缓存的数据可以以更快的方式检索,或者一次检索的数据更少。

于 2012-11-22T19:49:41.477 回答
3

缓存导致重复数据库查询的任何内容。

于 2012-11-22T19:51:04.163 回答