Web应用程序应在缓存中存储什么?

Jef*_*den 6 optimization memcached caching web-applications azure-caching

我意识到这可能是一个模糊的问题,而遗赠却是一个模糊的答案,但是我需要一些用于为Web应用程序缓存数据的真实示例,想法和/或最佳实践。我阅读的所有示例本质上都是技术性更高的(如何从相应的缓存存储区添加或删除缓存数据),但是我无法找到更高级的缓存策略。

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

因此,我想向社区提出我的问题,在这种情况下,您会/建议采取什么措施?

谢谢。

Jor*_*ger 6

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

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

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

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

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

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

这是一个非常广泛的问题,答案很大程度上取决于您要构建的特定应用程序/系统。我对您的特定情况还不够了解,不能说是否应该缓存所有用户的消息,但是本能地看似不是一个好主意,因为您似乎可以有效地缓存整个数据集。如果有新消息传入或被删除,可能会导致问题。然后,您是否会在缓存中更新它们?那不是简单地复制后备存储吗?

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