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 下午