我在我的应用程序上使用缓存应用程序块。 配置文件如下所示:
<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分钟,然后才从数据库中获取更新的值。
我错过了什么?
答案 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文章,介绍了如何正确使用它,包括看起来像代码的精确副本。