【问题标题】:Caching navigation tree in web application在 Web 应用程序中缓存导航树
【发布时间】:2017-11-27 19:10:22
【问题描述】:

说明

导航树 (NT) 是从 API 加载的(这不在我的控制范围内),它显示的节点是几种类型之一(类别、进程等),并且每次都会完成加载过程有人访问我的搜索页面 (Search.cshtml)。请注意,我从头开始创建 NT。它不是任何类型的插件。

出于优化目的,我需要缓存整个 NT(每个节点)。当用户进入搜索页面时,缓存的 NT 将根据用户的权限快速加载和过滤。

现在,我有了加载所有节点并按用户过滤它们的方法,我还有一个名为 partialNavigationTree (pNT) 的模型,它有 1 种用于擦除空文件夹的方法,以及 3 个类似 List<NavTreeNode> 的列表,其中NTN 也是一个模型,它存储了将节点渲染到搜索页面所需的一些信息。

因此,目标是拥有一个静态的、线程安全的 pNT 变量,该变量在 Web 应用程序初始化时加载,控制器的方法可以从中读取。我已经有一个特定的类来保存这个名为static class TheHelper 的变量。


我的计划

在类RouteConfig,方法RegisterRoutes中,我将代码从TheHelper类中加载静态变量CachedNavigationTree(CNT),然后让显示搜索页面的控制器复制CNT的内容到他的局部变量,过滤每个节点列表中的节点,然后传递给视图那个局部变量。这样我在 web 应用程序启动时获得 CNT,并在为每个用户加载 NT 时获得速度。


疑虑和问题

  1. 如何声明静态 CNT?当多个用户试图同时读取它时,像这样public static CachedNavigationTree { get; set; } 清除它会导致问题吗?这是保护 1 class 变量的线程安全方式吗?
  2. RouteConfig.RegisterRoutes 是我发现的“最深”功能(最接近 Web 应用程序启动点),因此我将“应用程序启动时执行此操作”代码放在那里。是否有一个“更深”/更好的地方可以放置这种代码?
  3. 由于 pNT 模型中的节点列表是 List<T>s,我该如何复制这些列表?如果我们有 2 个列表,A 和 B,假设 A 已满,然后输入 B = A;,那么 B 列表的项目将仅引用列表 A 中的项目,这意味着更改列表 B 的项目将更改列表作为项目反之亦然。这个对吗?我应该担心我复制列表的方式,还是我上面所说的错误,我可以轻松地说var localList = TheHelper.CachedNavigationTree;
  4. 这是我根据我所掌握的知识提出的缓存方式。如果在 C#/MVC 中已经存在缓存类变量的预制方式,我不会感到惊讶。如果它存在,并且您知道它,请详细说明。

编辑

问题 3 实际上是 - 如何将完整列表复制到空列表中,并再次从完整列表中生成项目。因为在 C# 中,当您输入 List<string> A = new ...; List<string> B = A; 时,当您更改(比如说)B 列表中的第一项时,该项目也会在 A 列表中更改。所以实际上同一个列表只有 2 个名称,而不是 RAM 中的 2 个列表。希望这可以清除问题 3。另外,请回答 here。我很抱歉解释不好。

【问题讨论】:

  • 最好使用MemoryCache来存储数据(你可以提供一个包装器来检查它是否存在于缓存中,如果不存在则调用api加载它以防万一缓存无效)。然后,每次用户导航到您的 Search 页面时,您只需调用一个获取数据的方法(您可以在启动时填充数据,或者让第一个导航到该方法的用户填充数据。跨度>
  • 不清楚您认为RouteConfig 与您的问题有什么关系。如果您的模型和现有代码至少看不到基本结构,那么很难理解您在第 3 点提出的问题

标签: c# list caching model-view-controller asp.net-mvc-5


【解决方案1】:

1) 我认为您最好使用MemoryCache 来保存您的变量,这仍然可以在整个应用程序中访问,但它是保存数据的特定设备(并且是它的设计用途)。使用它也很简单。您可以在 System.Web.Caching 中找到 Cache 以获取旧的 pre 3.5 应用程序或 MemoryCache System.Runtime.Caching 以获取较新的应用程序)。这还将为您提供一些额外的控制,如过期、可配置的大小限制、轮询间隔等。CacheMemoryCache 之间的主要区别在于,较新的MemoryCache 也设计用于在不支持的系统下工作。直接 ASP.NET

2) 您可能想查看 MSDN 上的 Application Life-cycle 详细信息。在您的global.asax 文件中,还有更多专门设计用于此类目的的处理程序和挂钩 - 无论是在应用程序首次启动时 (Application_Start) 还是在页面请求进入时 (@987654333 @)。您可以在Application_Start 中构建缓存,然后让它调用过期回调,以便在事情随时间变化时重新计算(并替换您的变量),而不必每次进行更改时都重新启动您的应用程序。

3) 很抱歉,我在这里没有完全理解您的要求。

4) 个人 ID 切换到在此系统中使用 MemoryCache 并在那里缓存您的数据。如果您只是向请求导航树的用户发送静态 API 值,那么我也会考虑使用 Varysystem 实现 Response Caching

【讨论】:

  • 昨天我偶然发现了MemoryCache,但你的问题仍然是正确的。你回答了我的其他问题。非常感谢!
猜你喜欢
  • 2012-11-03
  • 1970-01-01
  • 1970-01-01
  • 2014-07-16
  • 2018-07-05
  • 2012-06-02
  • 1970-01-01
  • 2011-09-08
  • 1970-01-01
相关资源
最近更新 更多