如何在MVC中执行缓存

时间:2010-02-23 10:06:41

标签: asp.net-mvc caching

我想在1天内执行数据缓存。 在我的MVC模型中,我从数据库中获取数据并在View上使用它。 如果不存在,我想在缓存中添加数据。如果它已经在缓存中,那么直接从那里获得结果。 在我的模型中,我有一个函数result(),因为我使用了缓存作为

if (HttpContext.Current.Cache[ID] == null)
{   
  query = db.Employee.FirstOrDefault(x=>x.id.Equals(ID));  
          HttpContext.Current.Cache.Insert
            (ID, query, null,DateTime.Now.AddDays(1),  
               System.Web.Caching.Cache.NoSlidingExpiration);
} else query = (Employee)HttpContext.Current.Cache[ID];

但是这里的缓存只适用于当前请求,之后再次从数据库中恢复数据,并在缓存中为相同的数据执行新的插入。我希望缓存中的数据为1天。  请告诉我缓存数据的方法。

感谢。

2 个答案:

答案 0 :(得分:1)

您是要缓存操作的整个输出还是只是数据库查询?

如果是这样,请对您的操作使用OutputCache属性,如下所示:

[OutputCache(Duration = 86400, VaryByParam = "None")]
public ActionResult Index()
{
    var data = GetFromDatabase();
    return View(data);
}

86400意味着我们要将其缓存24小时。

请注意,这会缓存整个视图,因此您的所有用户都会看到相同的内容。如果您有任何特定于用户的内容,请发表评论,我会尝试为您提供新的解决方案。

答案 1 :(得分:-1)

如果可能的话 - cache ViewResults。更轻松,更好。

对于原始缓存,我正在使用它,它按预期工作(跨多个请求)=>

public static class CacheManager
    {
        public static bool Exists
            (string cacheKey, HttpContextBase context)
        {
            return context.Cache[cacheKey] != null;
        }

        public static object Get
            (string cacheKey, HttpContextBase context)
        {
            return context.Cache[cacheKey];
        }

        public static T Get<T>
            (string cacheKey, HttpContextBase context)
            where T : class
        {
            return context.Cache.Get(cacheKey) as T;
        }

        public static T Get<T>
            (string cacheKey, HttpContextBase context, Func<T> getItemCallback)
            where T : class
        {
            T item = Get<T>(cacheKey, context);
            if (item == null) {
                item = getItemCallback();
                //by default - caching for 1 day
                if (item!=null)
                    context.Cache.Insert(cacheKey, item, null, 
                        DateTime.Now.AddDays(1),TimeSpan.Zero);
            }

            return item;
        }

        public static void Save<T>
            (string cacheKey, HttpContextBase context, T value)
            where T : class
        {
            context.Cache.Insert(cacheKey, value);
        }
    }

用法=&gt;

 public IList<Database> AllDatabases
        {
            get
            {
                return CacheManager.Get
                   (CacheKeys.AllDatabases, ControllerContext.HttpContext,
                    () => databaseRepository.GetAll());
            }
        }

仅 - 我认为传递上下文基础是不必要的复杂性。