MemoryCache意外逐出C#
本文关键字:意外 MemoryCache | 更新日期: 2023-09-27 18:27:19
在我的生产服务器上,我有一个大量使用的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();
}
由于我的主循环每隔一分钟左右就会检查一次空条目,我收到了很多电子邮件。这几乎就像添加失败了,或者项目被逐出了?
我在一些地方读到,如果内存不足,项目可能会被驱逐。正如发生这种情况时所发生的那样,一个维护脚本正在SQL Server中运行,盒子上的可用内存几乎为零。我关闭了一些我在服务器上运行的程序,chrome,SSMS等,瞧,没有更多的日志条目或电子邮件。
由于我已经明确地将项目的过期时间设置为Now+24小时,我希望它能在24小时内添加该项目!
这里的解决方案是什么?我是否必须将CacheItemPriority设置为NotRemoveable,然后在24小时后手动删除该项?
有点违背了我如何使用缓存的观点,或者NotRemovable会与AbsoluteExpirationDate协同工作吗?
您可以使用
MemoryCache.CreateCacheEntryChangeMonitor()
创建一个CacheEntryChangeMonitor对象,该对象可以触发事件以响应对指定缓存项的更改。
查看相关项目是否已从缓存中删除。
该方法返回一个CacheEntryChangeMonitor实例,其NotifyOnChanged方法用于提供在缓存更改时调用的回调方法。
此外,请验证您的服务是否未重新启动。也许它正在崩溃,并设置为在崩溃时重新启动?
我认为,所描述的行为是正确的——没有合同或定义表明该项不能在任何时候从缓存中逐出。
IMHO最好每24小时安排一次电子邮件,例如。https://www.quartz-scheduler.net/或您选择的任何其他调度库。
这将非常清楚地表明你的意图。