【问题标题】:Caching image handler output strategies缓存图像处理程序输出策略
【发布时间】:2011-11-16 12:41:07
【问题描述】:

首先,我很欣赏这个问题可能被视为主观问题,但我坚信应该并且可能是对我的问题的明确答案。

在工作中,我们目前正在实施一种使用通用处理程序动态调整图像大小和提供图像的策略,缓存问题已成为一个有争议的问题。

在我的原始实现中,调整大小的图像缓存在内存中,并具有基于原始图像的缓存依赖性。

例如

using (MemoryStream ms = new MemoryStream())
{
    imageEditor.Image.Save(ms, imageFormat);
    // Add the file to the cache.
    context.Cache.Insert(key, 
        ms.ToArray(), 
        new System.Web.Caching.CacheDependency(path)
        );
    imageEditor.Dispose();

    // Set the context headers and serve.
    SetHeaders(ms.GetHashCode(), context, responseType);
    context.Response.BinaryWrite(ms.ToArray());
}

这有它的缺点。

  1. 每次应用程序池工作进程被回收时(默认每 1740 分钟),我们都会丢失缓存中的所有内容。
  2. 如果有很多图像,我们可能会面临系统内存超载并导致内存不足异常的危险。 (如果使用量达到一定水平,IIS 是否会通过回收应用程序池来防止这种情况发生?)

我的一位同事建议我们实现一个文件缓存系统,而不是保存调整大小的文件,而是在后续请求中提供该文件,这应该(我不知道操作系统 IO 缓存内存管理的复杂性)减少内存用法。虽然这可以让我们在循环中保留调整大小的图像,但我发现这种方法存在一些主要问题:

  1. 我们无法再跟踪原始文件,所以如果有人上传 我们调整大小的图像将不正确。
  2. 文件服务器会随着时间的推移被数千张图像污染
  3. 与从内存中读取相比,读取文件速度较慢。特别是如果您正在阅读多个文件。

最好的整体方法是什么?微软是否在某处定义了标准?我们构建的网站通常非常繁忙,因此我们非常希望能够做到这一点并达到最佳标准。

【问题讨论】:

    标签: asp.net caching


    【解决方案1】:

    我的网站上有一个类似的系统。关于您对文件缓存系统的反对意见:

    1,2) 在我的网站上,我有一个类,所有文件保存/加载都通过该类。您可以实现类似的东西,每当用户上传新图像时清除所有缓存的、调整大小的图像。如果您以可预测的方式命名文件,这并不难。如果您担心存储空间,您可以实施一些措施来删除所有上次访问日期太旧的缓存图像。

    3) 这取决于您的网站的运作方式。我的网站有大量图像,因此将它们全部存储在内存中是不可行的。如果您的网站图片较少,这可能是更好的解决方案。

    【讨论】:

    • 抱歉回复晚了。我喜欢你实施的想法。我正在考虑创建一个后台线程来检查原始图像创建日期的散列版本并在一定时间后删除文件,但这可能会打开一罐蠕虫。
    【解决方案2】:

    这不是您问题的完整答案,但是,您不应该通过将大量内容放入缓存中来导致系统内存不足异常。如果系统内存开始不足,application cache 将自动开始删除不重要且很少使用的项目,以避免导致任何内存问题。

    【讨论】:

    • 应该,但我认为我宁愿对内存进行更严格的控制。不过还是谢谢。
    【解决方案3】:

    【讨论】:

    • 我查看了控件的源代码,并没有给我留下深刻的印象。它最初是由实习生编写的,不处理透明 gif 等。不过,谢谢。
    猜你喜欢
    • 2010-10-08
    • 2012-09-20
    • 2010-12-12
    • 2013-11-26
    • 2011-03-06
    • 1970-01-01
    • 2011-03-01
    • 2020-06-11
    • 2010-10-06
    相关资源
    最近更新 更多