经常更新的最佳缓存策略数据(Redis/Memcached vs Nginx/Varnish vs Materialized view)
Best caching strategy data that is updated frequently (Redis/Memcached vs Nginx/Varnish vs Materialized view)
我目前是 运行 AWS EC2 Ubuntu 服务器,它从 Postgres RDS 数据库实例中获取数据。在特定页面的视图函数中使用的 SQL 查询之一有很多连接并且运行速度很慢。我已经尝试 trim 查询并删除了一些可能有点不必要的连接,但它仍然需要比预期更长的时间来加载(至少 6 秒)。我目前正在研究潜在的缓存策略以帮助加快页面服务。
我考虑过使用实体化视图,但是原始视图函数获取的数据平均每 30 秒更新一次,我担心实施触发器或定期 cron 作业来如此频繁地刷新 MatView将对数据库造成影响,并且可能不是定期更新和更改的数据的最佳策略(除非有人可以建议另一种更新 MatView 中的行的方法,该方法不涉及 运行 看起来像与原来的非常相似)
到目前为止,我已经在 Elasticache 实例上测试了 Redis,对其工作方式印象深刻,但是我也被推荐查看 Nginx 和 Varnish 缓存策略。
我有点困惑哪种缓存策略最适合这种情况。与在 EC2 实例上实现 Nginx/Varnish 相比,Elasticache 实例上的 Redis/Memcached 会不会有点过于重量级?在 Nginx 缓存中尝试缓存经常更改的数据是否被认为是一个坏主意?
粗略地说,您会使用像 Redis 或 Elasticache 这样的低级缓存来缓存原始数据(例如 SQL 查询的结果);而你会使用更高级别的缓存,如 Nginx 或 Varnish 来缓存显示数据的整个 HTML 页面。因此,哪个合适在某种程度上取决于您的用例。如果您有一个包含慢速数据的简单页面(或页面片段),并且该内容对所有用户显示相同,那么高级缓存可能是合适的。如果内容受到许多小的调整和重新格式化,这会使整个页面缓存非常零散,那么较低级别的缓存将是合适的。
实际上,这些技术与 high/low 分离并没有紧密联系:您可以将整个页面存储在 Redis 中,而将单个数据片段存储在 Varnish 中,所以并没有那么简单。但一般来说,在决定 如何 缓存它之前先决定 你想要缓存什么。
即使您已经决定要缓存什么内容,选择正确的技术也将取决于很多考虑因素。 AWS 上的 Elasticache 具有完全托管的优势,因此可以节省您的维护费用,但可能是 运行 最昂贵的(至少在 small/medium 规模上)。带有文件系统后端的 Nginx 缓存可能是最快和最便宜的实施方式,但不会很好地扩展(并且随着规模的增加重构会很尴尬)。 Varnish 和 Redis 可能最好作为单独的 EC2 实例来实现,所以坐在中间的某个地方。
我目前是 运行 AWS EC2 Ubuntu 服务器,它从 Postgres RDS 数据库实例中获取数据。在特定页面的视图函数中使用的 SQL 查询之一有很多连接并且运行速度很慢。我已经尝试 trim 查询并删除了一些可能有点不必要的连接,但它仍然需要比预期更长的时间来加载(至少 6 秒)。我目前正在研究潜在的缓存策略以帮助加快页面服务。
我考虑过使用实体化视图,但是原始视图函数获取的数据平均每 30 秒更新一次,我担心实施触发器或定期 cron 作业来如此频繁地刷新 MatView将对数据库造成影响,并且可能不是定期更新和更改的数据的最佳策略(除非有人可以建议另一种更新 MatView 中的行的方法,该方法不涉及 运行 看起来像与原来的非常相似)
到目前为止,我已经在 Elasticache 实例上测试了 Redis,对其工作方式印象深刻,但是我也被推荐查看 Nginx 和 Varnish 缓存策略。
我有点困惑哪种缓存策略最适合这种情况。与在 EC2 实例上实现 Nginx/Varnish 相比,Elasticache 实例上的 Redis/Memcached 会不会有点过于重量级?在 Nginx 缓存中尝试缓存经常更改的数据是否被认为是一个坏主意?
粗略地说,您会使用像 Redis 或 Elasticache 这样的低级缓存来缓存原始数据(例如 SQL 查询的结果);而你会使用更高级别的缓存,如 Nginx 或 Varnish 来缓存显示数据的整个 HTML 页面。因此,哪个合适在某种程度上取决于您的用例。如果您有一个包含慢速数据的简单页面(或页面片段),并且该内容对所有用户显示相同,那么高级缓存可能是合适的。如果内容受到许多小的调整和重新格式化,这会使整个页面缓存非常零散,那么较低级别的缓存将是合适的。
实际上,这些技术与 high/low 分离并没有紧密联系:您可以将整个页面存储在 Redis 中,而将单个数据片段存储在 Varnish 中,所以并没有那么简单。但一般来说,在决定 如何 缓存它之前先决定 你想要缓存什么。
即使您已经决定要缓存什么内容,选择正确的技术也将取决于很多考虑因素。 AWS 上的 Elasticache 具有完全托管的优势,因此可以节省您的维护费用,但可能是 运行 最昂贵的(至少在 small/medium 规模上)。带有文件系统后端的 Nginx 缓存可能是最快和最便宜的实施方式,但不会很好地扩展(并且随着规模的增加重构会很尴尬)。 Varnish 和 Redis 可能最好作为单独的 EC2 实例来实现,所以坐在中间的某个地方。