我的后端有一个组合授权和菜单结构系统。 出于性能原因,EntLib缓存用于前端客户端(MVC rel 1.0网站,IIS 5.1本地,IIS 6.0服务器,无群集)。
有时'Cache.Contains'将返回true,但缓存的内容为NULL。我肯定知道我填写正确,所以这里可能出现什么问题?
编辑:当我将缓存设置为1分钟并添加cacheKey'A_Key'时,我会在检查CurrentCacheState时看到密钥返回。当我在2分钟后查看CurrentCacheState时,密钥仍然存在。当我执行'contains'时,返回true。当我再次执行'contains'时,cacheKey消失了! 同步问题??
此致 米歇尔
摘录:
if (IntranetCaching.Cache.Contains(cacheKey))
{
menuItems = (List<BoMenuItem>)IntranetCaching.Cache[cacheKey];
}
else
{
using (AuthorizationServiceProxyHelper authorizationServiceProxyHelper = new AuthorizationServiceProxyHelper())
{
menuItems = authorizationServiceProxyHelper.Proxy.SelectMenuByUserAndApplication(APPNAME, userName, AuthorizationType.ENUM_LOGIN);
IntranetCaching.Add(cacheKey, menuItems);
}
}
和cachehelper:
public static class IntranetCaching
{
public static ICacheManager Cache { get; private set; }
static IntranetCaching()
{
Cache = CacheFactory.GetCacheManager();
}
public static void Add(string key, object value)
{
Cache.Add(
key
, value
, CacheItemPriority.Normal
, null
, new Microsoft.Practices.EnterpriseLibrary.Caching.Expirations.AbsoluteTime(TimeSpan.FromMinutes(10)));
}
}
答案 0 :(得分:1)
感谢迈克尔跟进你自己的问题,我一直坚持这一天,确定如果我尝试从缓存中检索一个项目,这是因为到期(+ 0到25秒)我会得到一个NULL值。 Codeplex已经在他们的FAQ中发布了一种解决方法(
)一个。在刷新项目时,如何避免从CacheManager获取空值? - 间歇性地,您可能会遇到这种情况。要解决此问题,请创建自己的ICacheItemExpiration实现。在HasExpired()方法中,实现一个逻辑,该逻辑将检查项目是否已过期,并在项目已过期时更新该项目的值。此方法应始终返回false,以使项目不被标记为已过期。由于在HasExpired()方法中返回false,该项目将不会刷新,并将包含方法中实现的更新值。 参考:link
答案 1 :(得分:0)
我收到了Avanade(Entlib的创建者)的以下回复:
最有可能的是BackgroundScheduler 还没有完成它的扫地。如果 你要检查来源 代码,Contains方法只检查 如果特定密钥存在于 在内存上的内存缓存哈希表 GetData方法,代码首先检查 如果该项目已过期,如果已过期, 该项目已从缓存中删除。
Sarah Urmeneta Global Technology&amp; 解决方案Avanade,Inc。 entlib.support@avanade.com
该解决方案对我有用。 仍然存在的问题仍然是,为什么你可以使用'包含',因为它的结果不能以合理的方式使用。
此致 微米。