Memorycache 不会存储我的对象
Memorycache won't store my object
所以我围绕 System.Runtime MemoryCache 编写了几个包装器方法,以便在我的 ASP.NET MVC 应用程序中为每个视图模型获取一个 general/user 绑定缓存上下文。
在某些时候,我注意到我的委托每次都不断被调用,而不是无缘无故地检索我存储的对象。
奇怪的是 none 我的单元测试(使用简单的数据来检查它)失败或显示了一个模式来解释这一点。
这是包装方法之一:
public T GetCustom<T>(CacheItemPolicy cacheSettings, Func<T> createCallback, params object[] parameters)
{
if (parameters.Length == 0)
throw new ArgumentException("GetCustom can't be called without any parameters.");
lock (_threadLock)
{
var mergedToken = GetCacheSignature(parameters);
var cache = GetMemoryCache();
if (cache.Contains(mergedToken))
{
var cacheResult = cache.Get(mergedToken);
if (cacheResult is T)
return (T)cacheResult;
throw new ArgumentException(string.Format("A caching signature was passed, which duplicates another signature of different return type. ({0})", mergedToken));
}
var result = createCallback(); <!-- keeps landing here
if (!EqualityComparer<T>.Default.Equals(result, default(T)))
{
cache.Add(mergedToken, result, cacheSettings);
}
return result;
}
}
我想知道这里是否有人知道导致对象在 MemoryCache 中存储无效的条件。
在那之前,我将删除我复杂的 类' 属性,直到存储正常工作。
尽管如此,体验还是很有趣的。
发生这种情况有几个常见的原因(假设将对象实际添加到 cache/find 正确的缓存实例的逻辑正确):
- x86(32 位)进程有 "very small" 内存量要处理 - 在缓存(或缓存的特定实例)之外消耗过多内存相对容易,结果项目将立即已从缓存中逐出。
- ASP.Net应用域由于各种原因回收也会清除缓存。
备注
- 通常,您会将 "per user cached information" 存储在会话状态中,以便对其进行适当管理,并且可以通过 SQL/other 进程外状态选项进行持久化。
- 如果您需要支持更多用户,依靠缓存每个用户对象可能不会提高性能。您需要仔细衡量对预期负载水平的影响。
所以我围绕 System.Runtime MemoryCache 编写了几个包装器方法,以便在我的 ASP.NET MVC 应用程序中为每个视图模型获取一个 general/user 绑定缓存上下文。
在某些时候,我注意到我的委托每次都不断被调用,而不是无缘无故地检索我存储的对象。
奇怪的是 none 我的单元测试(使用简单的数据来检查它)失败或显示了一个模式来解释这一点。
这是包装方法之一:
public T GetCustom<T>(CacheItemPolicy cacheSettings, Func<T> createCallback, params object[] parameters)
{
if (parameters.Length == 0)
throw new ArgumentException("GetCustom can't be called without any parameters.");
lock (_threadLock)
{
var mergedToken = GetCacheSignature(parameters);
var cache = GetMemoryCache();
if (cache.Contains(mergedToken))
{
var cacheResult = cache.Get(mergedToken);
if (cacheResult is T)
return (T)cacheResult;
throw new ArgumentException(string.Format("A caching signature was passed, which duplicates another signature of different return type. ({0})", mergedToken));
}
var result = createCallback(); <!-- keeps landing here
if (!EqualityComparer<T>.Default.Equals(result, default(T)))
{
cache.Add(mergedToken, result, cacheSettings);
}
return result;
}
}
我想知道这里是否有人知道导致对象在 MemoryCache 中存储无效的条件。
在那之前,我将删除我复杂的 类' 属性,直到存储正常工作。
尽管如此,体验还是很有趣的。
发生这种情况有几个常见的原因(假设将对象实际添加到 cache/find 正确的缓存实例的逻辑正确):
- x86(32 位)进程有 "very small" 内存量要处理 - 在缓存(或缓存的特定实例)之外消耗过多内存相对容易,结果项目将立即已从缓存中逐出。
- ASP.Net应用域由于各种原因回收也会清除缓存。
备注
- 通常,您会将 "per user cached information" 存储在会话状态中,以便对其进行适当管理,并且可以通过 SQL/other 进程外状态选项进行持久化。
- 如果您需要支持更多用户,依靠缓存每个用户对象可能不会提高性能。您需要仔细衡量对预期负载水平的影响。