我应该将缓存数据保留在内存中以用于webapp吗?

时间:2017-01-25 09:09:51

标签: go web-applications

我有一个保存产品的数据库。

还有一个类别列表。

每个产品属于一个类别。

当产品列表更新时,我运行一个查询数据库的函数updateProductsCategories(),计算每个类别中的产品数量并返回如下列表:

Food:    20
Drinks:  74
Jackets: 15 

我在网页边栏中使用此列表,将类别显示为包含产品数量的链接。

我的假设是我应该在产品更改时运行updateProductsCategories(),尽管每次加载页面时都不会调用它,但是将其结果放在内存中的对象中并从中获取数据以显示在页面。

这样我每次显示页面时都不会进行不必要的数据库查询,但会使用缓存数据,并且在产品发生变化时会更新,因为它会刷新。

由于对象不大,我现在不需要像Redis那样需要任何其他解决方案。

这是优化应用的正确和常用方法吗?它会在现实世界中为应用程序增加速度吗?

2 个答案:

答案 0 :(得分:1)

如果:

  • 您经常需要统计数据(每个类别中的产品数量)
    和/或获取统计数据需要相对较长的时间/负载
  • 并且产品更新“不常见”(与您需要统计数据的频率相比)

然后是的,值得保留在记忆中。每次更新产品时,您可以使缓存的数据无效并再次计算延迟(在需要时)或在更新后立即计算新的统计数据。

要记住的事情:

  • 在多个goroutine上提供Web请求时,应同步访问这些统计信息
  • 如果您有多个服务器实例,这些统计信息可能会变得不准确;在这种情况下,您需要一个像Redis
  • 这样的中央缓存

答案 1 :(得分:0)

  

优化应用是否是正确且常用的方式?

我认为将此方法用于不会产生大量数据的简单查询更为常见。复杂查询或每个用户会话获取的任何内容最好在共享缓存中使用。正如@icza所提到的,拥有多个服务器实例应该让你重新思考你的解决方案是否是最佳的。

  

它会在现实世界中为应用程序增加速度吗?

在你的情况下,是的,一点点。