【发布时间】: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());
}
这有它的缺点。
- 每次应用程序池工作进程被回收时(默认每 1740 分钟),我们都会丢失缓存中的所有内容。
- 如果有很多图像,我们可能会面临系统内存超载并导致内存不足异常的危险。 (如果使用量达到一定水平,IIS 是否会通过回收应用程序池来防止这种情况发生?)
我的一位同事建议我们实现一个文件缓存系统,而不是保存调整大小的文件,而是在后续请求中提供该文件,这应该(我不知道操作系统 IO 缓存内存管理的复杂性)减少内存用法。虽然这可以让我们在循环中保留调整大小的图像,但我发现这种方法存在一些主要问题:
- 我们无法再跟踪原始文件,所以如果有人上传 我们调整大小的图像将不正确。
- 文件服务器会随着时间的推移被数千张图像污染
- 与从内存中读取相比,读取文件速度较慢。特别是如果您正在阅读多个文件。
最好的整体方法是什么?微软是否在某处定义了标准?我们构建的网站通常非常繁忙,因此我们非常希望能够做到这一点并达到最佳标准。
【问题讨论】: