【问题标题】:Asp.net Cache Dropdown Data on Client客户端上的 Asp.net 缓存下拉数据
【发布时间】:2010-02-06 11:57:09
【问题描述】:

我们希望在客户端机器上缓存一些下拉列表的数据,以减少缓慢变化的信息的传输。此数据将在业务应用程序的多个页面上使用,例如,包含 5,000 名客户的客户列表经常用于搜索、创建销售订单或其他目的。 我们已经尝试了使用页面完全加载数据以及分页数据库访问和按需加载网格,这仅带回 25-50 条记录。用户抱怨这两个选项的性能并希望它更快,因此我们正在寻找有关如何在客户端缓存数据以供重用的选项。

我们在网上看到了一些关于缓存的表示,可能一个 JS 文件可以由服务器生成并在本地缓存为 ddl 的数据源,但从未找到如何做到这一点。

有什么建议吗?或者您会推荐其他选项?

注意:我们也需要解决此问题的到期问题,因为某些列表每天会更改几次并且应该刷新(不是在计时器上,而是在它们根据响应代码更改时)。

【问题讨论】:

    标签: asp.net caching client-side


    【解决方案1】:

    在您尝试开始在客户端上缓存内容之前,这是一种不可预知的做事方式,原因很简单,您无法控制他们的浏览器如何设置缓存(如果他们将缓存设置为“从不”?),您应该查看很多内容。

    1. 您是否首先查看了服务器上的缓存?您可以使用 OutputCache 并通过参数(例如网格页码)对其进行更改,以对所有查看的数据集进行部分缓存。

    2. 究竟什么是用户体验缓慢?使用 firebug 或 fiddler 对其进行分析,并查看每页向服务器发出的请求数。简单地减少发送的 HTTP 请求的数量(例如,通过合并和缩小 CSS 和 javascripts)将对响应时间产生奇迹。

    3. 您的 ViewState 中有什么?减少在 ViewState 中来回发送的数据量,以加快页面加载速度。

    4. 服务器上的数据获取例程是否耗时过长?对其进行优化,也许可以将数据缓存在服务器上,这样您就不必经常访问数据库。

    也许您已经尝试过所有这些,但我想我会把它扔掉,因为依赖客户端缓存可能会令人沮丧。

    【讨论】:

    • 感谢您的建议 - 我们已经尝试了所有这些要点,尽管它们有所帮助,但仍然存在问题。 (1) 是 - 已在可能的情况下在服务器上进行缓存(某些搜索页面过于动态,无法定义固定参数的迭代)。 (2) 例如,在您创建客户订单的屏幕上,有一个基本的标题和详细信息网格。一次加载所有客户 (>5000) 非常慢,但由于网络连接速度较慢,即使使用高级 Sql 分页通过自定义对象按需加载 50 个客户也需要 3-4 秒。
    • (3) 是的,我们已经这样做了 - 初始页面大小约为 175kb,大多数视图状态在控件上关闭,用于检索客户的 Ajax 帖子为 1kb - 在具有高带宽的高速服务器上连接的用户这表现非常好,并且使用“虚拟分页”滚动下拉菜单甚至感觉是瞬间的,但不幸的是,在我们的场景中,每个请求都有 3-4 秒的响应,因此仅填写带有多个下拉菜单的订单标题令人沮丧给用户。 (4) 不是获取问题 - Sql Profiler 显示 10-15 毫秒的时间。
    • 如果我们在页面加载时仅在页面中包含三个下拉列表(每个 ddl 1000-5000)的数据(仅 Id 和名称),那么大小会跳到接近 Mb 并且响应时间超过 20 秒在用户的网络上加载。当然,在那之后页面工作正常,但我们正在寻找快速页面加载和快速下拉响应。这种场景下的网络/带宽升级成本也非常高,不能用来解决问题。
    【解决方案2】:

    您可以通过 javascript 执行此操作,将列表转换为 JSON 并通过服务器缓存中的脚本标记提供它。我说 JSON 是因为 jQuery 或任何其他 javascript 框架可以轻松使用它。

    例如在 html/aspx 中:

    <script src="CustomerList.aspx?Refresh=12308798798023745" type="text/javascript"></script>
    

    刷新是上次在服务器上更改的 DateTime.Now.Ticks。因此,当您在每个页面中添加此标签时,客户端只会获取它一次,然后在服务器上实际更改时再次获取它。

    类似这样的服务器端:

    public class Cache {
      public static List<Customer> Customers { get; set; }
      public static DateTime LastRefresh { get; set; }
      public static void RefreshCustomers {
        //Populate Customers, Customers = blah;
        LastRefresh = DateTime.Now;
      }
    }
    

    在页面中:

    ScriptTagwithRunAtServer.Src = "CustomerList.aspx?Refresh=" + Cache.LastRefresh.Ticks;
    

    呈现该标签的任何方式都可以,这只是一个示例。 CustomerList.aspx 页面只会将 Cache.Customers 呈现为 json 形式...并且您的页面将运行一些 javascript 来使用它。

    只是一个想法,如果您感兴趣,请发表评论,我会遗漏一些内容。

    【讨论】:

    • 如果我继续这样做,这将是我的方法(TBH,我会尽量避免它并将其保留在服务器端)。但是,我也会考虑在某种到期时间添加“控制”的 some 元素。
    • @Rob - 这是?Refresh=#### 的想法,它告诉客户端在更新的 JSON 可用时刷新......或者你的意思是缓存过期?
    • 尼克 - 这很有趣。然后这是否也缓存在客户端?我们能否找到一种方法在客户端缓存客户列表一次并在多个页面上重用该缓存(无需返回服务器获取客户列表),即在订单页面、订单搜索页面……?
    • @asp2go - 是的,这种方法将使用缓存在所有页面的客户端浏览器缓存中的相同 javascript 文件,浏览器不会关心 javascript 用于哪个页面。缓存的 .js 文件也可以包含填充使用该数据的内容(选择列表、搜索框等)的 jQuery/javascript。
    • 感谢您的信息。这听起来就像我们正在寻找的 - 只是不确定如何实现,所以我们会做一些搜索并尝试让它工作。如果有人有更多关于如何设置的示例或详细信息,那就太好了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多