代码之家  ›  专栏  ›  技术社区  ›  Mark Bell

存储在ASP.NET缓存中的对象尽管设置了滑动过期时间,但从未过期的可能原因有哪些?

  •  1
  • Mark Bell  · 技术社区  · 16 年前

    Cache.Insert("TEST_VALUE", 150, null, Cache.NoAbsoluteExpiration, TimeSpan.FromSeconds(120));
    

    然而,如果在10分钟后我运行一个从缓存中写出该值的页面,它仍然在那里(事实上,在整整一个小时后仍然在那里)。我知道没有其他东西可以访问它,因为这都在我机器上的本地服务器上。

    有人能告诉我为什么这些值没有从缓存中清除吗?


    不管怎样,我已经尝试了您的建议,当我刷新显示缓存值的页面时,断点从未被击中。

    我假设即使从缓存中读取也会延长对象的寿命,因此我在刷新“调试”页面之前将其保留5-10分钟,但该值仍然存在!

    8 回复  |  直到 12 年前
        1
  •  4
  •   Markus Olsson    16 年前

    只是一个调试提示:将缓存对象的值设置为DateTime。现在插入它以查看它是何时插入的。通过这种方式,您可以轻松确定它是以某种方式重新插入的,还是某个地方的某个东西一直在访问,从而迫使它留在缓存中。

    再加上我关于订阅缓存过期事件并写入日志文件的建议,应该可以为您提供足够的信息来定位问题。

        2
  •  1
  •   Joseph Ferris    16 年前

    对你来说,这是一个正确的假设。你在哪里做缓存?

    我询问的原因是,如果您在Global.asax中,例如在Application_Start中执行此操作,并且该应用程序在页面视图之间循环,它将显示相同的行为。

        3
  •  1
  •   Ben Aston    16 年前

    在缓存读取的所有实例上放置断点,以查看它们是否意外命中(从而延长对象的生命)?

        5
  •  0
  •   Markus Olsson    16 年前

    您是否绝对确定不只是在每次点击页面时将项目插入缓存?

    就我所知,这是唯一能解释这种行为的东西。

    我建议您在Cache.Insert发生的行上设置一个断点,并查看当您点击页面时它是否执行。您还可以订阅缓存的remove回调,并在缓存过期时写入文件。如果这样做,您可以执行一次页面;这样就可以插入项目,然后坐下来观察文件,看它是否被删除。

        6
  •  0
  •   Mark Bell    16 年前

    好的,我想我已经弄明白了,但我不确定这到底是为什么:

    在我最初在代码中将值分配给缓存之后,出现了一个循环,在每次迭代中,我使用以下方法将一个新值分配给同一对象:

    Cache["TEST_VALUE"] = counter;
    

    但是,使用这种语法,一旦发生这种情况,日志文件就会显示该项已从缓存中删除,即使该项仍然可以由刚刚写出缓存对象值的单独页面访问?

    Cache.Insert("TEST_VALUE", newvalue, null, Cache.NoAbsoluteExpiration, TimeSpan.FromSeconds(120));
    

    现在在日志中,我得到了相同的删除通知,紧接着是另一个添加通知,该项在120(ish)秒后正确过期,不再可以从其他页面访问。

    我很困惑,但谢谢你的帮助:)

        7
  •  0
  •   Ben Aston    16 年前

    <cache disableExpiration="true"/> 
    

    是否未在web.config中设置?

        8
  •  0
  •   Eonasdan Alex Mckay    12 年前

    只要您的计算机处于打开状态,并且内存块没有被其他数据替换。缓存永远不会过期。即使关闭浏览器并重新打开,也可以检索它。

    • cache("Key") = 10
    • 关闭浏览器
    • textbox.text = cache("Key") .