自定义图像处理程序:缓存策略

时间:2009-02-18 14:37:58

标签: html http caching httphandler

场景

我正在为通信应用程序构建自定义CMS。用户可以将图像上传到服务器,然后在使用markdown写入的帖子中引用它们。图像存储在数据库中,并使用images/{id}形式的URL引用。自定义图像处理程序检索这些并设置远期的expires标头,以便不会反复提取它们。将图像存储在文件系统中不是每个客户的选项。

帖子作为markdown和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>

问题

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

可能的解决方案

版本字段

使用图像存储版本字段。在编辑图像时增加它,生成images/{id}/version/{version}形式的网址。

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

新网址

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

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

304 - 未修改

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

这似乎是迄今为止我所获得的最佳解决方案。除非经过编辑,否则图像会被缓存,但我之前从未使用过这种方法。如果页面上有50个图像,则仍有50个请求到服务器。带宽将减少,但延迟仍然存在。这种方法是否值得花费?

问题

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

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:-1)

将图像放在磁盘上,让Web服务器处理它。

文件可以保留相同的名称(因此也可以保留URL),Web服务器可以处理来自浏览器的已修改标头。对于具有已知扩展名的URLS,浏览器也可以更快乐。

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