go - 我应该将缓存数据保存在 Web 应用程序的内存中吗?

标签 go web-applications

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

还有一个类别列表。

每个产品都属于一个类别。

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

Food:    20
Drinks:  74
Jackets: 15 

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

我的假设是我应该像产品更改时那样运行 updateProductsCategories(),虽然不是每次加载页面时都调用它,而是将其结果放入内存对象并获取数据从它显示在页面上。

这样我就不会在每次显示页面时都进行不必要的数据库查询,而是会使用缓存的数据,并在产品更改时刷新它,使其始终保持最新。

由于对象不大,我认为我现在不需要任何额外的解决方案,如Redis。

这是优化应用程序的正确且通用的方法吗?它会在现实世界中提高应用程序的速度吗?

最佳答案

如果:

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

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

注意事项:

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

关于go - 我应该将缓存数据保存在 Web 应用程序的内存中吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41847444/

相关文章:

java - 用于高度安全的Web应用程序的工具和技术

node.js - 加速 websocket 的最佳方法

go - 从给定与浏览器相同的参数的页面发出 GET 请求在 golang 上不起作用

postgresql - Go 和 postgres 将整数重新解释为 nil 类型

mysql - 为什么我不能用 'goapp deploy' 部署到 GAE,我找不到导入 : "github.com/go-sql-driver/mysql"

Go Coverage over multiple package 和 Gitlab Coverage Badge

php - 不小心删除了admin如何通过phpmyadmin mysql将其添加回来

javascript - WebOS 在浏览器关闭时重置 LocalStorage?

http - 在 Jmeter 中同时运行的最大线程数是多少?

amazon-web-services - 使用 AWS SAM 3 秒后 AWS Lambda 函数超时