2

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

<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>

我虽然expirePollFrequencyInSeconds属性将控制缓存中存储的值的过期,所以如果我尝试获取缓存存储 60 秒或更长时间的值,它将从数据库而不是缓存中获取。但是,通过这种配置,我看到该值仍在从缓存中获取大约 5 分钟,然后才从数据库中获取更新的值。

我错过了什么?

4

2 回答 2

3

发现了问题。expirePollFrequencyInSeconds参数不影响缓存中的项过期,只是对过期项的清理频率

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

于 2013-08-07T14:26:58.267 回答
1

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

我相信,目前缓存中的默认行为是在缓存中最多存储 1000 个元素,然后通过删除 10 个最少使用的缓存项来开始清理内存。正如您设置的那样,它将每 60 秒检查一次每个项目。

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

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

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

于 2013-08-07T14:28:39.320 回答