在资源被浏览器缓存的情况下最小化数据库查询(Django 项目)

Minimizing DB queries in cases where the resource is browser cached (Django project)

在我正在开发的 Django Web 应用程序中,有一个页面需要在列表中显示多个用户头像。在相关视图中,我使用 Django ORM 来获取这些 url,如下所示:

Avatar.objects.filter(id__in=user_list).values('id','url)

接下来,我设置了我的 nginx 网络服务器来缓存静态资源,只需通过:

map $sent_http_content_type $expires {
    default                    off;
    text/html                  epoch;
    text/css                   max;
    application/javascript     max;
    ~image/                    max;
}

我的理解是,每当处理为头像列表页面提供服务的视图时,早期的 Django ORM 查询总是 运行。因此,网络服务器缓存允许我保存 GET 请求,但 不是实际的数据库查找 。这个理解对吗?

如果是这样,仅当图像未缓存在浏览器中时才调用 ORM 查询的模式是什么?这可能(或可取)吗?如果没有,为什么不呢?

我有兴趣了解在此类情况下 Web 开发的最佳实践。说明性的例子会很棒!

在您的情况下,您可能希望保持原样并每次都查询数据库(这没有什么不好的!)

浏览器需要为每个图像获取一个 URL 以检查它是否在其缓存中,而 URL 最终来自数据库。如果必须的话,你可以通过在服务器端缓存查询结果来解决这个问题,但我不建议这样做,除非你有性能问题。此缓存将完全独立于(并且不知道)浏览器缓存。

以下是 more-or-less 我对这个问题的心智模型的步骤 - 希望这对您有所帮助:

  1. 浏览器 - 向网络服务器发送请求
  2. Weberver - 获取请求,查询数据库以获取图像 URL
  3. 数据库 - 回复网络服务器
  4. 网络服务器 - 用网页回复浏览器
  5. 浏览器 - 检查其他资源的响应(例如带有 URLs 的 img 标签)
  6. 浏览器 - 检查这些资源的缓存并在它们被缓存且有效时显示它们
  7. 浏览器 - 请求它没有从 Imageserver 缓存的资源
  8. Imageserver - 将图像内容传送到浏览器,包括缓存 headers
  9. 浏览器 - 显示图像

备注:

Webserver 和Imageserver 可以相同也可以不同。 Imageserver 发送的缓存 headers 是让浏览器缓存它们的重要因素。

您提到您设置了 NGINX 来缓存静态资源。它不是缓存,而是将包含有关缓存说明的 headers 发送到请求资源的浏览器。