Memorycache不会存储我的对象

时间:2015-01-29 15:45:03

标签: c# asp.net-mvc memorycache

所以我在System.Runtime MemoryCache周围编写了几个包装器方法,以便在我的ASP.NET MVC应用程序中为每个viewmodel获取一般/用户绑定的缓存上下文。

在某些时候,我注意到我的委托每次都不停地被调用,而不是没有明显的原因检索我存储的对象。

奇怪的是,我的单元测试(使用简单数据检查)都没有失败,或者显示出解释的模式。

这是包装方法之一:

    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中存储对象无效的条件。

在此之前,我只是剥离了复杂的课程&#39;属性直到存储工作。

然而,经验会很有趣。

1 个答案:

答案 0 :(得分:1)

有几个常见的原因可能发生(假设正确的逻辑实际添加对象到缓存/找到正确的缓存实例):

  • x86(32位)进程有#34;非常小&#34;要处理的内存量 - 在缓存(或缓存的特定实例)之外消耗太多内存相对容易,因此结果项将立即从缓存中逐出。
  • 由于各种原因,ASP.Net app域名回收也会清除缓存。

注释

  • 通常您存储&#34;每个用户缓存的信息&#34;在会话状态,所以它适当地管理,可以通过SQL /其他进程外状态选项保持。
  • 如果您需要支持更多用户,
  • 依赖于缓存每用户对象可能无法提高性能。您需要仔细测量对预期负载水平的影响。