【问题标题】:Proper timestamps for cache in C#C#中缓存的正确时间戳
【发布时间】:2016-06-07 23:18:54
【问题描述】:

我正在创建网络文件系统的内存本地缓存。

我希望每个目录/文件都具有LastDownloadedTime 属性,然后将其与当前时间进行比较以确定目录/文件是否太旧而无法从缓存中使用。

但我不确定DateTime.Now() 是否是我需要的。如果用户更改系统时间会怎样?如何在 .NET 中获得适合我的任务的 simestamps?

【问题讨论】:

    标签: c# .net caching timestamp


    【解决方案1】:

    看看System.DateTime.UTCNow()。它将返回 UTC 时间。只需确保您始终在两端调用(存储缓存时以及测试过期时)。

    更多信息:https://msdn.microsoft.com/en-us/library/system.datetime.utcnow(v=vs.110).aspx

    【讨论】:

    • UTCNow() 只考虑时区变化。
    【解决方案2】:

    您应该使用DateTimeOffset。根据docs

    唯一且明确地识别单个时间点。 DateTimeOffset 类型可用于明确定义“现在”的含义,记录事务时间,记录系统或应用程序事件的时间,以及记录文件创建和修改时间。

    但是,如果您的应用程序在用户的机器上运行,他们可以更改他们的系统时间(正如您所提到的)。防止这种情况的唯一方法是让您的应用程序 ping 时间服务器以获取权威时间戳。

    【讨论】:

      【解决方案3】:

      我想我将使用Stopwatch 作为时间戳,因为我的文件系统缓存在内存中,它无法在系统重新启动后继续存在。时间戳将与Stopwatch 的开头相关。

      虽然,Stopwatch 被称为 buggy

      但我认为依赖系统时钟的解决方案更加危险,因为用户可能会将系统时钟设置为过去的某个日期,从而搞砸一切。

      【讨论】:

        【解决方案4】:

        如果您停留在本地服务器范围内,则 DateTime.UtcNow 是该任务最方便的选项。是的,如果用户更改本地时间,那么这将使缓存无效并触发不必要的更新。

        您需要使用 NTP(时间)服务器来避免该问题。因此,您将从 NTP 服务器获取 UTC 时间,而不是使用本地服务器 UTC 时间(世界上有很多可用的)。

        请参考NTP wikipedia article

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-07-20
          • 2012-01-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多