我想在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天。 请告诉我缓存数据的方法。
感谢。
答案 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());
}
}
仅 - 我认为传递上下文基础是不必要的复杂性。