我有一个缓存提供程序:
public static class CacheAsideHelper
{
public static T GetOrAdd<T>(Func<T> builder, TimeSpan expiresIn, bool ignoreNullValues, params string[] keys)
{
var key = GetKey(keys);
CacheItemWrapper itemWrapper = null;
var cachedItem = MemoryCache.Default.Get(key);
if (cachedItem != null)
{
itemWrapper = (CacheItemWrapper)cachedItem;
}
if (itemWrapper != null && !(DateTime.Now.Subtract(itemWrapper.InsertedAt).TotalSeconds >=
expiresIn.TotalSeconds))
{
return (T)itemWrapper.Item;
}
////expired or not in cache
var item = builder();
if (item == null && ignoreNullValues)
{
return default(T);
}
var wrapper = new CacheItemWrapper
{
InsertedAt = DateTime.Now,
Item = item
};
MemoryCache.Default.Add(key, wrapper, DateTime.Now.Add(expiresIn));
return item;
}
}
这是调用示例:
return (CacheAsideHelper.GetOrAdd(
() => GetSchema(connectionString, tableName),
new TimeSpan(Consts.MemoryCacheExchangeRateExpirationHours, 0, 0), true, tableName)).ToList();
我意识到无论数据是否在缓存中,始终都会调用GetSchema函数。
所以我踩了代码,原来是这样:
代码将命中此行并返回缓存中的项目:
返回(T)itemWrapper.Item;
在那之后,它还点击了 GetSchema 函数。
CachAside例程中似乎有一个错误,但是,我的代码看不到任何错误。