【问题标题】:Is there any way to suspend MemoryCache expiration for a certain period of time?有什么办法可以将 MemoryCache 过期暂停一段时间?
【发布时间】:2014-12-08 13:14:41
【问题描述】:

我正在使用 .NET 的 MemoryCache 类在我的应用程序中缓存数据。在大多数应用程序的用例中,绝对和/或滑动过期缓存策略对我的应用程序非常有用。但是,在某些时间段,应用程序可能会启动一个长时间运行的进程,该进程不会更新任何应用程序数据。该过程通常很长,以至于缓存将过期并在此过程中清除缓存的数据,这是我真正希望数据保留在缓存中的时候。有什么方法可以暂时暂停 MemoryCache 的过期和/或清除?

我可以扔掉我所有的物品并逐个更改过期政策,但我担心缓存中有数十万甚至数百万的物品,那不会从性能的角度工作。

一种想法是将项目放回 CacheEntryRemovedCallback 中的缓存中,但这似乎是在与系统作斗争而不是使用它,并且不是线程安全的。

任何想法都将不胜感激。

【问题讨论】:

  • 这确实有点宽泛。如果没有一些特定的代码,只能提供关于使用缓存的非常广泛的建议;例如,不要试图“强迫”它去持有这样的东西,如果你有这么多的东西,考虑一个不同的策略。
  • 您会建议什么替代策略?正如我所说,MemoryCache 非常擅长保存我需要的大量项目,并且在我 95% 的用例中都非常有效。
  • 好吧,你可能已经把它推到了极限。这是一个缓存;不是持久的内存存储。您确实需要基于某些特定代码的更集中的问题。在这方面真的不可能给你有用的一般性建议。
  • 我的问题是,MemoryCache 或其他替代 .Net 缓存能否处理我的用例?我不想要一个持久的内存存储:这会很快导致我的应用程序内存不足——我想要一个基于某些策略驱逐的缓存。我只是希望我的策略根据应用程序所处的“模式”更加动态......

标签: c# .net memorycache


【解决方案1】:

Memcached 或 NCache 是平面内存缓存系统,它以类似的方式支持您的过期。您的数据/缓存提供程序 Lib 必须具备智能才能在到期时重新填充它。

您可以对 MemoryCache 使用 InfiniteAbsoluteExpiration 策略,但它将永远拥有它。或者编写自己的缓存库。 MemoryCache 使用计时器进行过期检查。您可以使用扩展逻辑让您知道的版本为您执行此操作。

您的自定义策略扩展对象应该有委托订阅应用程序进程事件以使项目过期。

祝你好运 -斯里尼

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-02
    • 2011-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多