MVC 在一天中的特定时间后清除缓存
MVC clear cache after certain time of day
我有一个带有 OutputCache
属性的控制器操作,如下所示:
[OutputCache(Duration = 14400)] // 4 hours
public ActionResult Index()
{
var model = // fill out model
return View(model);
}
所以我将操作缓存了 4 个小时。我想做的是不管这4个小时到多长时间,如果是晚上10pm
之后,我要reset/clear缓存。这可能吗?
DateTime expireWeights = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 23, 59, 59, 999); Cache.Insert("CacheItemName", list, null, expireWeights, System.Web.Caching.Cache.NoSlidingExpiration);
您可以在 Cache object 上设置一个 absoluteExpiration 时间,这是一个 DateTime。
您还可以将 absoluteExpiration 与 SqlCacheDependency 结合使用。
关于缓存过期不拉取新数据的问题:你可以连接一个CacheItemRemovedCallback来接收缓存过期的通知,然后刷新缓存。
或
在型号中
public class NoCache : ActionFilterAttribute
{
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
filterContext.HttpContext.Response.Cache.SetExpires(DateTime.UtcNow.AddDays(-1));
filterContext.HttpContext.Response.Cache.SetValidUntilExpires(false);
filterContext.HttpContext.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches);
filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
filterContext.HttpContext.Response.Cache.SetNoStore();
base.OnResultExecuting(filterContext);
}
}
控制器:-
[NoCache]
[Authorize]
public ActionResult Home()
{
////////...
}
您必须使用以下行代码设置到期时间:DateTime.UtcNow.AddMinutes(1350)。
否则 (1350*60)--> 每次操作调用它时,持续时间和控制器都必须通过你的文件
[OutputCache(Duration = 81000, VaryByParam = "none")]
public ActionResult Index()
{
//reset cache
User u = new User();
return Content(u.getCountryDetails());
//send notification
}
或
您可以在您的控制器
中向您的HttpContext.Response添加一个Header
HttpContext.Response.Headers.Add("refresh", "1350; url=" + Url.Action("Index"));
您可以通过多种方式进行缓存,这取决于您的舒适程度。
希望对你有帮助。
您考虑问题的方式使问题变得过于复杂。如果你想在晚上 10 点失效并缓存 4 小时,你总是得到相同的缓存时间,所以新的缓存在晚上 10 点、凌晨 2 点、早上 6 点等开始。
我想你可以这样实现它:
public override string GetVaryByCustomString(HttpContext context, string custom)
{
if (!string.IsNullOrWhiteSpace(custom))
{
switch (custom)
{
case "4HoursStart10":
var baseDate = DateTime.Now.AddHours(-2);
return "CacheKey-" + (baseDate.Hour / 4);
break;
}
}
return base.GetVaryByCustomString(context, custom);
}
这将每 4 小时为您提供一个新的缓存键:
- 2017 年 9 月 7 日的 CacheKey-4 6:00:40 下午
- 2017 年 9 月 7 日的 CacheKey-4 7:00:40 下午
- 2017 年 9 月 7 日的 CacheKey-4 8:00:40 下午
- 2017 年 9 月 7 日的 CacheKey-4 9:00:40 下午
- 2017 年 9 月 7 日的 CacheKey-5 10:00:40 下午 <- 晚上 10 点新!
- 2017 年 9 月 7 日的 CacheKey-5 11:00:40 下午
- 2017 年 9 月 8 日的 CacheKey-5 12:00:40 AM
- 2017 年 9 月 8 日的 CacheKey-5 1:00:40 AM
- 2017 年 9 月 8 日的 CacheKey-0 2:00:40 上午 <- 新的,因为它已经 4 小时了
- 2017 年 9 月 8 日的 CacheKey-0 3:00:40 AM
- 2017 年 9 月 8 日的 CacheKey-0 4:00:40 AM
- 2017 年 9 月 8 日的 CacheKey-0 5:00:40 AM
- 2017 年 9 月 8 日的 CacheKey-1 6:00:40 上午 <- 新的,因为它已经 4 小时了
- 2017 年 9 月 8 日的 CacheKey-1 7:00:40 AM
- 2017 年 9 月 8 日的 CacheKey-1 8:00:40 AM
- 2017 年 9 月 8 日的 CacheKey-1 9:00:40 AM
- 2017 年 9 月 8 日的 CacheKey-2 10:00:40 上午 <- 新的,因为它已经 4 小时了
- 2017 年 9 月 8 日的 CacheKey-2 11:00:40 AM
- 2017 年 9 月 8 日的 CacheKey-2 12:00:40 下午
- 2017 年 9 月 8 日的 CacheKey-2 1:00:40 下午
- 2017 年 9 月 8 日的 CacheKey-3 2:00:40 下午 <- 新的,因为它已经 4 小时了
- 2017 年 9 月 8 日的 CacheKey-3 3:00:40 下午
- 2017 年 9 月 8 日的 CacheKey-3 4:00:40 下午
- 2017 年 9 月 8 日的 CacheKey-3 5:00:40 下午
我有一个带有 OutputCache
属性的控制器操作,如下所示:
[OutputCache(Duration = 14400)] // 4 hours
public ActionResult Index()
{
var model = // fill out model
return View(model);
}
所以我将操作缓存了 4 个小时。我想做的是不管这4个小时到多长时间,如果是晚上10pm
之后,我要reset/clear缓存。这可能吗?
DateTime expireWeights = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 23, 59, 59, 999); Cache.Insert("CacheItemName", list, null, expireWeights, System.Web.Caching.Cache.NoSlidingExpiration);
您可以在 Cache object 上设置一个 absoluteExpiration 时间,这是一个 DateTime。
您还可以将 absoluteExpiration 与 SqlCacheDependency 结合使用。
关于缓存过期不拉取新数据的问题:你可以连接一个CacheItemRemovedCallback来接收缓存过期的通知,然后刷新缓存。
或 在型号中
public class NoCache : ActionFilterAttribute
{
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
filterContext.HttpContext.Response.Cache.SetExpires(DateTime.UtcNow.AddDays(-1));
filterContext.HttpContext.Response.Cache.SetValidUntilExpires(false);
filterContext.HttpContext.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches);
filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
filterContext.HttpContext.Response.Cache.SetNoStore();
base.OnResultExecuting(filterContext);
}
}
控制器:-
[NoCache]
[Authorize]
public ActionResult Home()
{
////////...
}
您必须使用以下行代码设置到期时间:DateTime.UtcNow.AddMinutes(1350)。 否则 (1350*60)--> 每次操作调用它时,持续时间和控制器都必须通过你的文件
[OutputCache(Duration = 81000, VaryByParam = "none")]
public ActionResult Index()
{
//reset cache
User u = new User();
return Content(u.getCountryDetails());
//send notification
}
或 您可以在您的控制器
中向您的HttpContext.Response添加一个HeaderHttpContext.Response.Headers.Add("refresh", "1350; url=" + Url.Action("Index"));
您可以通过多种方式进行缓存,这取决于您的舒适程度。
希望对你有帮助。
您考虑问题的方式使问题变得过于复杂。如果你想在晚上 10 点失效并缓存 4 小时,你总是得到相同的缓存时间,所以新的缓存在晚上 10 点、凌晨 2 点、早上 6 点等开始。
我想你可以这样实现它:
public override string GetVaryByCustomString(HttpContext context, string custom)
{
if (!string.IsNullOrWhiteSpace(custom))
{
switch (custom)
{
case "4HoursStart10":
var baseDate = DateTime.Now.AddHours(-2);
return "CacheKey-" + (baseDate.Hour / 4);
break;
}
}
return base.GetVaryByCustomString(context, custom);
}
这将每 4 小时为您提供一个新的缓存键:
- 2017 年 9 月 7 日的 CacheKey-4 6:00:40 下午
- 2017 年 9 月 7 日的 CacheKey-4 7:00:40 下午
- 2017 年 9 月 7 日的 CacheKey-4 8:00:40 下午
- 2017 年 9 月 7 日的 CacheKey-4 9:00:40 下午
- 2017 年 9 月 7 日的 CacheKey-5 10:00:40 下午 <- 晚上 10 点新!
- 2017 年 9 月 7 日的 CacheKey-5 11:00:40 下午
- 2017 年 9 月 8 日的 CacheKey-5 12:00:40 AM
- 2017 年 9 月 8 日的 CacheKey-5 1:00:40 AM
- 2017 年 9 月 8 日的 CacheKey-0 2:00:40 上午 <- 新的,因为它已经 4 小时了
- 2017 年 9 月 8 日的 CacheKey-0 3:00:40 AM
- 2017 年 9 月 8 日的 CacheKey-0 4:00:40 AM
- 2017 年 9 月 8 日的 CacheKey-0 5:00:40 AM
- 2017 年 9 月 8 日的 CacheKey-1 6:00:40 上午 <- 新的,因为它已经 4 小时了
- 2017 年 9 月 8 日的 CacheKey-1 7:00:40 AM
- 2017 年 9 月 8 日的 CacheKey-1 8:00:40 AM
- 2017 年 9 月 8 日的 CacheKey-1 9:00:40 AM
- 2017 年 9 月 8 日的 CacheKey-2 10:00:40 上午 <- 新的,因为它已经 4 小时了
- 2017 年 9 月 8 日的 CacheKey-2 11:00:40 AM
- 2017 年 9 月 8 日的 CacheKey-2 12:00:40 下午
- 2017 年 9 月 8 日的 CacheKey-2 1:00:40 下午
- 2017 年 9 月 8 日的 CacheKey-3 2:00:40 下午 <- 新的,因为它已经 4 小时了
- 2017 年 9 月 8 日的 CacheKey-3 3:00:40 下午
- 2017 年 9 月 8 日的 CacheKey-3 4:00:40 下午
- 2017 年 9 月 8 日的 CacheKey-3 5:00:40 下午