1

情景

我正在为通信应用程序构建自定义 CMS。用户可以将图像上传到服务器,然后在他们使用 Markdown 编写的帖子中引用它们。图像存储在数据库中,并以 url 形式引用images/{id}。自定义图像处理程序检索这些并设置远期过期标头,因此不会一遍又一遍地获取它们。将图像存储在文件系统中不是每个客户的选择。

帖子以降价和 html 形式存储在数据库中以提高性能。

降价

###Header
Lorem Ipsum dolor sit amet.  ![funny cat](images/25)

HTML

<h3>Header</h3>
<p>
  Lorem Ipsum dolor sit amet. <img alt="funny cat" src="images/25" />
</p>

问题

这些图像也是可编辑的。从缓存的角度来看,这提出了一个问题。编辑图像时,我需要确保浏览器获取最新版本。我提出了以下解决方案,我发现所有这些解决方案都缺乏。

可能的解决方案

版本字段

使用图像存储版本字段。当图像被编辑产生形式的 url 时增加它images/{id}/version/{version}

如果图像 url 总是从数据库生成,这很好。但是,我将 url 作为文本存储在帖子中,并且必须为这些请求预处理可能的大量文本。此外,链接图像会很麻烦,因为在编辑图像后 url 会变得陈旧。这可能不是一个好主意。

新网址

编辑图像时,将其作为新条目存储在数据库中。

这意味着没有版本维护,但旧链接和旧帖子会遇到同样的问题。他们永远不会更新。性能会很好,但问题仍然存在。

304 - 未修改

存储每个图像的最后编辑字段。当有条件请求返回时,返回 http 状态 304 - 未修改,减少带宽使用。

这似乎是迄今为止我得到的最好的解决方案。除非经过编辑,否则图像会被缓存,但我以前从未使用过这种方法。如果页面上有 50 张图像,则仍有 50 个请求向服务器发送。带宽将减少,但延迟仍然存在。这种方法值得付出这样的代价吗?

问题

我在这方面的经验很少,我希望你们所有人都有更多。上述任何解决方案是否可行?如果是这样,您对他们的体验如何?如果不是什么是更好的方法?

4

2 回答 2

1

正如您所说,Conditional GET 它是最好的选择,因为您只需要检查一个请求标头(If-None-Match 或 If-Modified-Since)并发送回相应的状态代码(200 或 304)和一个标头(E-Tag 或 Last-Modified)。然后浏览器将处理图像缓存。

此外,根据您的服务器框架,如果您将图像存储在数据库中,您可以在第一次需要它们时缓存它们(在有限的时间内,因此您不会消耗所有服务器内存)。当您需要重复读取相同的图像时,这会有所帮助,从而节省数据库查询。当然,如果您编辑它们,您需要从服务器缓存中删除您的图像。

编辑:感谢您接受答案。如果您需要,这里有一个很好的解释性链接:RSS 黑客的 HTTP Conditional Get

于 2009-02-18T15:13:40.360 回答
-1

将图像放在磁盘上,让您的网络服务器处理它。

该文件可以保持相同的名称(以及因此的 URL),并且 Web 服务器可以处理来自浏览器的修改后的标头。浏览器也可以对带有已知扩展名的 URL 感到更满意。

将图像放入数据库并通过脚本提供它们通常不是一个好主意。只需引用数据库中的 URL。

于 2009-02-18T14:45:13.470 回答