经常更新的最佳缓存策略数据(Redis/Memcached vs Nginx/Varnish vs Materializ



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

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

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

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

粗略地说,你会使用像Redis或Elasticache这样的低级缓存来缓存原始数据(例如SQL查询的结果(;而你会使用更高级别的缓存,如Nginx或Varnish来缓存显示数据的整个HTML页面。 因此,哪一个合适在一定程度上取决于您的用例。 如果您有一个简单的页面(或页面片段(,其中包含慢速数据,并且该内容对所有用户的显示相同,则高级缓存可能是合适的。 如果内容需要进行大量小调整和重新格式化,从而使整个页面缓存非常碎片化,那么较低级别的缓存将是合适的。

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

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

相关内容

  • 没有找到相关文章

最新更新