【问题标题】:What are some possible reasons for objects stored in the ASP.NET Cache never expiring, despite having a sliding expiration time set?尽管设置了滑动过期时间,但存储在 ASP.NET 缓存中的对象永不过期的一些可能原因是什么?
【发布时间】:2010-09-25 07:26:57
【问题描述】:

我使用 ASP.NET 缓存缓存了一个值,代码如下:

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

据我了解,这应该意味着如果 120 秒内没有任何东西访问该对象,它将过期并返回 null。

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

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


谢谢,我明白你的意思了,但是我的 HttpModule 会在将任何内容插入缓存之前检查请求的类型,所以它只会在表单上传时发生。

无论如何,我已经尝试了您的建议,当我刷新显示缓存值的页面时,断点永远不会被命中。

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

【问题讨论】:

  • 我正在从 HttpModule 中进行缓存。

标签: asp.net caching


【解决方案1】:

只是一个调试提示:将缓存对象的值设置为 DateTime.Now 当您插入它以便查看它何时插入。这样您就可以轻松地确定它是否以某种方式重新插入,或者某个地方是否不断访问,从而迫使它留在缓存中。

结合我关于订阅缓存到期事件和写入日志文件的建议应该可以为您提供足够的信息来定位问题。

【讨论】:

    【解决方案2】:

    这是您的正确假设。你在哪里做缓存?

    我问的原因是,如果您在 Global.asax 中执行此操作,例如在 Application_Start 中,并且应用程序在页面视图之间被回收,它会表现出相同的行为。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        在这里复制您的原始问题:

        What's the reason for my ASP.NET Cache never expiring, despite having a sliding expiration time set?

        建议您提供有关缓存上下文的更多信息。

        【讨论】:

          【解决方案5】:

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

          我问的原因是因为您提到它是在 HttpModule 中完成的,并且它们通常在每个页面点击时执行。

          据我所知,这是唯一可以解释这种行为的东西。

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

          【讨论】:

            【解决方案6】:

            好的,我想我已经弄清楚了,但我不确定这是为什么:

            我按照你们的建议做了——肯定没有从缓存中读取任何内容,所以我编写了一个回调函数,将删除时间写入日志文件并将其订阅到过期事件。我还将每个项目添加到缓存中的时间写到了同一个日志中,这样我就可以看到这些内容在其中停留了多长时间。

            在我最初在代码中将值分配给缓存之后,然后有一个循环,我在每次迭代中为同一个对象分配一个新值,使用:

            Cache["TEST_VALUE"] = counter;
            

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

            我不明白为什么会这样 - 我知道上面的语法只会更新缓存中对象的值,但也许我错了?

            搞砸了,我更改了代码,以便循环中的上述行现在变为:

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

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

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

            【讨论】:

              【解决方案7】:

              验证

              <cache disableExpiration="true"/> 
              

              没有在您的 web.config 中设置?

              【讨论】:

                【解决方案8】:

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

                例如

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

                【讨论】:

                  猜你喜欢
                  • 2015-09-03
                  • 2021-12-17
                  • 2010-11-08
                  • 1970-01-01
                  • 2022-01-05
                  • 2014-11-18
                  • 2023-04-01
                  • 2021-09-11
                  • 2017-05-17
                  相关资源
                  最近更新 更多