内存缓存c#.net

时间:2017-09-25 14:17:42

标签: c# .net memorycache

我在内存中使用内存缓存保留数据大约120 GB我知道它太大但是我的项目的最佳做法是问题是我使用内存缓存对象如下

我为缓存内存创建了静态对象

var collection = new System.Collections.Specialized.NameValueCollection();
            collection.Add("CacheMemoryLimitMegaBytes", "155000");
            //var memoryCashe = new MemoryCache("Images", collection);
            MemoryCachingProvider.cache = new MemoryCache("Images", collection);
//Here how I add new item

CacheItemPolicy policy = new CacheItemPolicy();
                    policy.Priority = CacheItemPriority.NotRemovable;
                    cache.Add(key, value, policy);

但如果我没有使用它,记忆力会在一段时间后变空。

我正在构建Web API应用程序

我在RAM中有足够的空间大约170 GB

任何建议

3 个答案:

答案 0 :(得分:1)

缓存本质上是临时的。如果IIS旋转了应用程序池,那么所有这些资源都将被回收。您需要确保应用程序池永远不会回收(几乎不可能)或需要将此缓存移动到外部的持久资源,例如redis。

答案 1 :(得分:1)

正如其他人所说,这可能是因为IIS服务器回收而发生的。 "关闭"回收可以成为解决问题的好方法,可以作为紧急解决方案。但是,如果我在你的裤子里,在应用这个转变之后,我会尝试不同的方式来使用内存缓存而不会禁用回收过程。

回收

回收通常是*在IIS启动一个新进程作为应用程序的容器,然后将旧进程提供给ShutdownTimeLimit,以便在它被杀之前自行消除。

* - 通常:参见DisallowOverlappingRotation /"禁用重叠循环"设置

它具有破坏性,因为原始进程及其所有状态信息都被丢弃(包括您珍贵的内存缓存)。

该怎么做:

一般而言:

  • 禁用空闲超时。 20分钟不活动=热潮!下一个传入请求的新进程。将其设置为零。
  • 禁用常规时间间隔 - " 29小时"默认被描述为"疯狂","烦人"和"聪明"各方。实际上,其中只有两个是真的。
  • 如果您无法停止播放,请启用DisallowRotationOnConfigChange(上面,禁用回收以进行配置更改) - 这样您就可以更改任何应用程序池设置,而无需立即向工作进程发送信号被杀您需要手动回收应用程序池以使设置生效,这样您就可以预先设置设置,然后使用更改窗口通过回收过程应用它们。

这足以让一个表现良好的过程永远存在。如果它死了,当然,它会被更换。如果它挂起,ping应该选择它并且新的应该在2分钟内启动(默认情况下;最坏情况的计算应该是:直到ping频率+ ping超时+启动时间限制才能再次开始工作)。

<强> Sugestion:

使用进程外会话状态(例如,状态服务器或数据库,或者如果状态很小,甚至是cookie)可以允许您在不禁用循环的情况下解决此问题。


希望它有所帮助!

答案 2 :(得分:0)

通常如果它是“经过一段时间后”,则表示您可能拥有除“NoSlidingExpiration”之外的SlidingExpiration值。

除此之外,您的应用程序池可能会按特定时间间隔进行回收,这会让您感觉缓存已“清空”。