【问题标题】:How to efficiently add metadata to an arbitrary file in .NET?如何有效地将元数据添加到 .NET 中的任意文件?
【发布时间】:2011-03-20 09:36:49
【问题描述】:

我正在建立一个网络购物网站。出售的每个产品都可以附有几张图片以及任意附件(如带有手册的 PDF 等)。这些资源存储在我们自己的 ERP 系统中,并通过它的远程 API 访问。实际上,文件可以驻留在任何地方 - 数据库、硬盘驱动器、网络共享等。API 提供了访问它的统一接口。

为了提高性能,我打算将这些文件缓存在网络服务器上。有一个版本计数器机制可以让我有效地确定文件何时更改并使缓存条目无效。但是,我在哪里存储当前在缓存中的文件的版本号?缓存本质上是一个文件夹,可由网络服务器上的多个 ASP.NET 工作进程访问。网站本身没有数据库 - 所有数据都来自 ERP API。

理想情况下,这个数字会以某种方式与文件本身一起存储。这样当文件被删除时(例如,管理员决定清除缓存以提高磁盘使用率),元数据就不会徘徊。到目前为止,我有两个想法:

  1. 将其写入 ADS(备用数据流)中。不过,通过 .NET 访问它并不容易。存在库,但我更喜欢更优雅的解决方案(我也不知道性能)。
  2. 将其附加到文件本身。我所知道的所有文件格式对于附加到文件的数据都非常宽松。但是我需要在传输内容之前将其删除,这意味着我无法使用内置的TransmitFile - 再次让我担心性能。

有没有更好的办法?

【问题讨论】:

    标签: .net performance file metadata


    【解决方案1】:

    如果它只是一个版本号,你有没有想过将它包含在文件名中?例如:

    foo.txt.v131
    

    适用于 foo.txt 的 131 版。这种方法的一个很好的特点是,您可以编写文件的新版本(例如 132),而网络服务器仍然能够读取 131。当然,您仍然需要解决所有的交换语义。 .

    【讨论】:

    • 我已经考虑过了,甚至尝试实现它,但是当版本号更改时它会变得非常混乱。如果我不知道版本号(只是文件名),那么我必须枚举文件夹。更不用说潜在的并发问题......
    【解决方案2】:

    如果您知道产品经常变化,您可以每小时使缓存失效。

    更高级的方法是将每个缓存文件的 CRC 值存储在数据库版本中。然后运行后台服务(例如通过 Cron)来检查文件是否正在更改,然后使其失效。

    【讨论】:

    • 他们不会经常改变。但每隔一段时间,情况就会发生变化。如果已经有计数器,那么比较每个文件等是没有意义的。当我呈现产品页面(或列表)时,我会得到最新的计数器,因此我可以在运行中并且仅在真正需要时进行失效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-14
    • 1970-01-01
    • 1970-01-01
    • 2012-04-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多