【问题标题】:Set .net SqlDatasource Cache to expire at a certain time, every 10 mins on the clock将 .net SqlDatasource Cache 设置为在某个时间过期,时钟上每 10 分钟一次
【发布时间】:2018-05-14 19:29:16
【问题描述】:

我有一个 .net 网站,一个浏览器游戏,整个游戏每 10 分钟“翻转一次”,而翻转本身需要 5-10 秒。我有很多 GridViews 绑定到 sqldatasource 对象中相对繁重的查询,100 名玩家在回合之间刷新。这些网格在转弯之间几乎没有任何变化,所有真正的更新都发生在转弯翻转期间,所以我想在这些网格上启用缓存,因为它们是相对繁重的查询。然而,轮流在时钟上每 10 分钟翻转一次,而不是“每 10 分钟”。我不能只将 CacheDuration 设置为 600,因为根据您第一次访问特定网格的时间,从那时起 10 分钟可能会进入另一个回合。

我需要一种动态设置 CacheDuration 的方法,以便它在时钟到达的第 10 分钟时到期。我想有几种方法可以做到这一点:

我可以检查被绑定的特定 sqldatasource 是否存在缓存,如果不存在,则检查当前时间并适当设置缓存持续时间,使其在第 10 分钟到期。

当任何页面在与上一回合不同的回合加载时,也许有一种干净的方法可以清除一组 sqldatasources 中的所有缓存。已经有一个应用程序级别的变量来跟踪打开游戏的原因并检测页面何时在不同的回合加载。这可能会触发这样的缓存清除。

【问题讨论】:

    标签: .net webforms sqldatasource


    【解决方案1】:

    Asp.Net web 应用程序是面向事件的,所以你想要在页面加载时做的是......

    1. 设置一个表来记录您的缓存过期事件
    2. 使用查询检查页面加载时的日志表,以查看缓存是否已根据当前时间过期。即:如果缓存最后一次过期是在最后 10 分钟标记之前,那么它现在需要过期。
    3. 必要时触发缓存过期。

    换句话说,如果没有页面正在读取缓存,缓存是否仍然处于活动状态并不重要,但是当有人访问它时,您只需要确保您的最后一个过期事件在当前的 10 分钟窗口内。

    如果有我可以提供帮助的特定代码,请告诉我。邮政编码尝试让我评估。

    HTH

    【讨论】:

    • 我可以检查当前游戏回合,而不是检查时间戳,如果它发生变化,那么我知道所有缓存都会过期。必要时,我已经在每个页面加载时抓取了当前游戏打开。我不能为此使用“CacheDependency”吗?使 CacheDpeendency 基于变量?或者也许我可以将当​​前轮次存储到应用程序级变量中。如果回合发生变化,则缓存将下降。
    【解决方案2】:

    我知道这是旧的,但我有这个确切的需要并想出了这个。就我而言,我需要服务器缓存在整点后 12 分钟过期。

    在.aspx中的sqldatasource上设置如下属性

    datasourcemode="DataSet" enablecaching="true" cachekeydependency="ckd12MinAfter" cacheexpirationpolicy="Absolute" cacheduration="Infinite"
    

    在 Page_Load 代码隐藏中

    DateTime nextRefresh DateTime.Today.AddHours(DateTime.Now.Hour).AddHours(DateTime.Now.Minute > 10 ? 1 : 0).AddMinutes(12);
    if (Cache["ckd12MinAfter"] == null) { Cache.Add("ckd12MinAfter", "ckd12MinAfter", null, nextRefresh, Cache.NoSlidingExpiration, CacheItemPriority.Normal, null); }
    

    强制客户端刷新:

    <script type='javascript'>
      function reloadAfterHour(r) { // force a reload at the next r minutes after the top of the hour
        var now = new Date(), m = now.getMinutes(), h = now.getHours() + (m < r ? 0 : 1), t = new Date(now.toDateString())
        , n = new Date(); n.setTime(t.getTime() + (h * 60 * 60 * 1000) + (r * 60 * 1000)); ms = (n.getTime() - now.getTime());
        setTimeout(function () { location.reload(true); }, ms);
      }
      $(document).ready(function (e) { reloadAfterHour(12); });
    </script>
    

    【讨论】:

      猜你喜欢
      • 2020-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-01
      • 2017-06-23
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      相关资源
      最近更新 更多