【问题标题】:Best caching strategy data that is updated frequently (Redis/Memcached vs Nginx/Varnish vs Materialized view)经常更新的最佳缓存策略数据(Redis/Memcached vs Nginx/Varnish vs Materialized view)
【发布时间】:2019-02-28 03:57:55
【问题描述】:

我目前正在运行从 Postgres RDS 数据库实例获取数据的 AWS EC2 Ubuntu 服务器。在特定页面的视图函数中使用的 SQL 查询之一有很多连接,并且运行速度很慢。我试图减少查询并删除一些可能有点不必要的连接,但加载时间仍然比预期的要长一点(至少 6 秒)。我目前正在研究潜在的缓存策略,以帮助加快页面的服务速度。

我考虑过使用物化视图,但是原始视图函数获取的数据平均每 30 秒更新一次,我担心实施触发器或常规 cron 作业来刷新 MatView 这通常需要花费它对数据库的影响,并且可能不是定期更新和更改数据的最佳策略(除非有人可以建议另一种更新 MatView 中的行的方法,该方法不涉及运行看起来与原始查询非常相似的查询)

到目前为止,我已经在一个 Elasticache 实例上测试了 Redis,并且对它的工作方式印象深刻,但是我也被建议查看 Nginx 和 Varnish 缓存策略。

我有点困惑哪种缓存策略最适合这种情况。与在 EC2 实例上实现 Nginx/Varnish 相比,Elasticache 实例上的 Redis/Memcached 会有点过于重量级吗?尝试在 Nginx 缓存上缓存经常更改的数据是否被认为是一个坏主意?

【问题讨论】:

    标签: postgresql amazon-web-services nginx redis materialized-views


    【解决方案1】:

    粗略地说,您会使用 Redis 或 Elasticache 等低级缓存来缓存原始数据(例如 SQL 查询的结果);而您将使用 Nginx 或 Varnish 等更高级别的缓存来缓存显示数据的整个 HTML 页面。因此,哪一个合适取决于您的用例。如果您有一个包含慢速数据的简单页面(或页面片段),并且该内容向所有用户显示相同,那么高级缓存可能是合适的。如果内容经过大量小调整和重新格式化,这会使整页缓存变得非常碎片化,那么较低级别的缓存将是合适的。

    实际上,这些技术并没有与高/低分离紧密相关:您可以将整个页面存储在 Redis 中,而将单个数据片段存储在 Varnish 中,因此并非如此简单。但一般来说,在决定如何缓存它之前,先决定要缓存什么

    即使您已经决定要缓存什么,选择正确的技术也将取决于很多考虑因素。 AWS 上的 Elasticache 具有完全托管的优势,因此可以节省您的维护,但可能是运行成本最高的(至少在中小型规模上)。带有文件系统后端的 Nginx 缓存可能是最快和最便宜的实现,但不会很好地扩展(并且随着规模的增加重构会很尴尬)。 Varnish 和 Redis 可能最好作为单独的 EC2 实例实现,因此请放在中间的某个位置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-12
      • 2015-11-11
      • 1970-01-01
      • 2010-09-11
      • 2013-09-28
      • 2016-06-20
      • 2017-02-09
      相关资源
      最近更新 更多