在缓存应用程序块中配置缓存管理器到期时间

时间:2013-08-07 13:16:12

标签: c# .net

我在我的应用程序上使用缓存应用程序块。 配置文件如下所示:

<cachingConfiguration defaultCacheManager="Cache Manager">
    <cacheManagers>
      <add name="ParamCache" type="Microsoft.Practices.EnterpriseLibrary.Caching.CacheManager, Microsoft.Practices.EnterpriseLibrary.Caching, Version=5.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" expirationPollFrequencyInSeconds="60" maximumElementsInCacheBeforeScavenging="1000" numberToRemoveWhenScavenging="10" backingStoreName="NullBackingStore"/>
    </cacheManagers>
    <backingStores>
      <add type="Microsoft.Practices.EnterpriseLibrary.Caching.BackingStoreImplementations.NullBackingStore, Microsoft.Practices.EnterpriseLibrary.Caching, Version=5.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" name="NullBackingStore"/>
    </backingStores>
</cachingConfiguration>

我认为 expirationPollFrequencyInSeconds 属性将控制存储在缓存中的值的到期时间,因此如果我尝试获取缓存存储60秒或更长时间的值,那么从数据库而不是缓存中获取。 但是,通过这种配置,我发现该值仍然从缓存中提取约5分钟,然后才从数据库中获取更新的值。

我错过了什么?

2 个答案:

答案 0 :(得分:3)

发现问题。 expirationPollFrequencyInSeconds 参数不会影响缓存中的项目过期,只会影响清除过期项目的频率。

实际上,当项目被添加到缓存时设置了到期时间,在我的情况下,它被设置为5分钟......

答案 1 :(得分:1)

您实际上没有在缓存上设置超时策略。 expirationPollFrequencyInSeconds属性执行它所说的内容,它每隔60秒轮询一次缓存。

我认为,目前缓存中的默认行为是在缓存中存储多达1000个元素,然后通过删除10个最少使用的缓存项来开始清理内存。它会按照您设置的每60秒检查每个项目。

您需要在代码中的某处执行此操作,或者您可以在配置文件中对其进行配置,这是我建议的。

AbsoluteTime absTime = new AbsoluteTime(TimeSpan.FromMinutes(1));
cacheManager.Add("CacheObject", cachedInformation, CacheItemPriority.Normal, null, absTime);

这是一篇很好的CodeProject文章,介绍了如何正确使用它,包括看起来像代码的精确副本。