【问题标题】:MemoryCache Unexpected Eviction in C#C# 中的 MemoryCache 意外驱逐
【发布时间】:2014-10-21 22:25:11
【问题描述】:

在我的生产服务器上,我有一个大量使用的 SQL Server 实例和我的应用程序,它是一个 c# Windows 服务。我的服务在不同时间运行各种工作。它每 24 小时发送一封电子邮件,提供有关各种工作进度的最新信息。

代码通过检查内存缓存中的标志来确定是否发送电子邮件。代码如下:-

if (Common.MemCache.Get(Common.MemoryCacheActions.DailyEmail) == null)
{
    Common.Logger.Info("Collating email data.");
    Common.MemCache.Add(Common.MemoryCacheActions.DailyEmail, String.Empty, DateTime.Now.AddHours(24));

    SendEmail();
}

由于我的主循环每分钟左右检查一次空条目,我收到了很多电子邮件。就好像 Add 失败了,或者 item 被驱逐了?

我在某些地方读到过,如果没有足够的可用内存,项目可能会被驱逐。发生这种情况时,维护脚本正在 SQL Server 中运行,并且盒子上的可用内存几乎为零。我关闭了一些我在服务器上运行的程序、chrome、SSMS 等,瞧,没有更多的日志条目或电子邮件。

由于我已将项目的过期时间明确设置为现在 + 24 小时,我希望它会在 24 小时内添加项目!

这里的解决方案是什么,我是否必须将 CacheItemPriority 设置为 NotRemoveable,然后在 24 小时后手动删除该项目?

有点违背了我如何使用缓存的意义,或者 NotRemovable 会与 AbsoluteExpirationDate 一起工作吗?

【问题讨论】:

    标签: c# windows-services memorycache


    【解决方案1】:

    你可以使用

    MemoryCache.CreateCacheEntryChangeMonitor()

    创建一个 CacheEntryChangeMonitor 对象,该对象可以触发事件以响应对指定缓存条目的更改。

    查看相关项目是否已从缓存中删除。

    该方法返回一个CacheEntryChangeMonitor 实例,其NotifyOnChanged 方法用于提供一个回调方法,该方法在缓存更改时调用。

    另外,请确认您的服务没有重新启动。也许它正在崩溃并设置在崩溃时重新启动?

    【讨论】:

      【解决方案2】:

      我认为,所描述的行为是正确的 - 没有合同或定义说该项目不能随时从缓存中逐出。

      恕我直言,每 24 小时安排一次电子邮件更适合使用,例如https://www.quartz-scheduler.net/ 或您选择的任何其他调度库。

      这会很清楚地表明你的意图。

      【讨论】:

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