【问题标题】:Caching Expiration not working as expected缓存过期未按预期工作
【发布时间】:2016-05-02 23:56:46
【问题描述】:

我正在使用 HttpContext.Current.Cache 通过 CacheItemUpdateCallback 缓存昂贵的数据查询。

这个想法是用户必须加载一次数据,然后 updatecallback 保持对象每 30 分钟更新一次。

这就是我插入/覆盖缓存的方式:

HttpContext.Current.Cache.Insert(cacheID, cachedObject, null,
                                  expiryTimeStamp,
                                  Cache.NoSlidingExpiration,
                                  updateCallBack);   

出于测试原因,我将过期日期设置为这样(每 20 秒更新一次):

var expiryTimeStamp = DateTime.Now.Add(new TimeSpan(0, 0, 20));

这一切都很好。这意味着,它每 20 秒更新一次昂贵的对象 - 但仅持续大约 25 分钟。然后不再调用触发器“updateCallBack”!

我猜问题是 IIS 处理了缓存,因此不再触发回调“CacheItemUpdateCallBack”......但这只是一个猜测。

这引出了我的问题:

我必须在 app.config 或 IIS 中设置任何设置吗?还是我做错了什么?

编辑: 此外,我不明白为什么带有CacheItemUpdateCallback 的Insert overload 没有参数CacheItemPriority。 但是,overload with CacheItemRemovedCallback 确实有一个优先级参数。也许,如果我可以将 CacheItemPriority 设置为“高”,它已经解决了我的问题。

编辑:我发现了问题:每个应用程序池都有一个空闲超时属性,设置为 20 分钟。

【问题讨论】:

  • 你有updateCallback的代码吗?你实现它的方式会影响这一切的工作方式。比如“如果回调方法抛出异常,ASP.NET会抑制异常并移除缓存的值”……也许你25分钟后出于某种原因抛出异常
  • 也许您的应用程序域因任何原因被 IIS 回收 (stackoverflow.com/questions/302110/…),因此启动时缓存为空。

标签: c# asp.net caching iis


【解决方案1】:

应用程序池的idle timeout 设置为 20 分钟(默认情况下)。而且因为它是一个测试实例,所以没有用户让网站保持活力。

【讨论】:

    【解决方案2】:

    如果您对 IIS 缓存过期的猜测结果是正确的,那么 this 可能是您想要调整的设置。

    但我猜如果这发生在每次精确的 25 分钟之后,那么您在某处设置了隐藏配置,因为如果您不指定缓存过期,那么只要进程正在运行,或者如果有内存分配紧急情况。

    【讨论】:

    • 我也已经尝试过了 - 没有任何成功。就我而言,我将其设置为一年。我打算周一试试6天,谢谢!
    • 嘿 Fabian,由于缺乏声誉,我在这里发表评论。只是为了我和未来的谷歌员工的清楚,空闲超时迫使您的进程停止,最终导致从 IIS 中清除缓存。正确的 ?如果是这样,那么空闲超时确实是隐藏配置;)
    • 是的,伙计!让我头疼的是隐藏属性“空闲超时”。
    • 我猜你给我指出了正确的方向。所以gz你的赏金。 ;-)
    • 谢谢 Fabian,你真是太慷慨了 :)
    猜你喜欢
    • 1970-01-01
    • 2013-08-20
    • 1970-01-01
    • 2020-07-19
    • 1970-01-01
    • 2018-06-05
    • 2020-10-20
    • 2011-05-17
    • 1970-01-01
    相关资源
    最近更新 更多