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 进程外状态选项进行持久化。
  • 如果您需要支持更多用户,依靠缓存每个用户对象可能不会提高性能。您需要仔细衡量对预期负载水平的影响。