最佳方式(最佳性能)锁定文件创建

4
我有一个Web应用程序,用于向前端返回图像。 在这个应用程序中,当请求特定的图像时,应用程序会检查该图像是否已经存在于磁盘上;如果存在,则返回该图像。
我的问题开始于当该图像不存在于磁盘上时。在这种情况下,同时为相同的图像进行了两个请求,而该图像并不存在于磁盘上。当两个线程尝试同时创建磁盘上的相同文件时,就会出现问题。
为了解决问题,我尝试在创建磁盘映像时创建了一个Mutex。但它有一个问题:由于大量同时请求的数量很高,服务器负载很高,导致服务器崩溃。
我想问一下您解决这个问题的想法。或者您会采取其他措施吗?
谢谢。

也许这个链接包含有用的信息http://social.msdn.microsoft.com/Forums/vstudio/en-US/a5300fc5-126c-4e33-8ae6-13376031e9fe/how-to-lock-or-unlock-a-file-using-c?forum=csharpgeneral - Mo Patel
2个回答

2
您可以尝试以下模式:
  1. 尝试读取图像(如果成功,则完成)
  2. 使用写锁创建图像
  3. 仅在“文件正在使用异常”时,延迟一小段时间(毫秒)
  4. 返回到步骤1(重试)
使延迟非常小,只比创建图像所需的时间稍微长一点。实现重试限制,最多3次左右。
这将允许您利用已经存在的(文件)锁定机制。

-1

您可以使用O_CREATO_EXCL标志调用open函数。第一个进程的打开调用将获得独占访问权限以创建文件并开始下载图像。随后进程的打开调用将失败,因为它们的打开不是独占的,"errno"将被设置为EEXIST。

根据您的设计,随后的进程可以等待完整的文件创建,也可以返回。

fd = open(path, O_CREAT|O_EXCL)

抱歉,但我正在使用ASP.NET。 - Ricardo Felgueiras
是的!因为我已经标记了我的问题为 C# 而不是 C。 - Ricardo Felgueiras

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接