在Web应用程序中缓存导航树

时间:2017-11-27 19:10:22

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

说明

导航树(NT)是从API(不在我的控制中)加载的,它显示的节点是每种类型中的一种(类别,进程等),并且每次都进行加载过程有人进入我的搜索页面(Search.cshtml)。请注意,我从头开始创建NT。它不是任何形式的插件。

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

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

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

我的计划

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

关注点和问题

  1. 如何声明静态CNT?当多个用户同时尝试从中读取时,是否会将此TheHelper删除会导致问题?这是保护1 public static CachedNavigationTree { get; set; }变量的线程安全方式吗?
  2. class是我找到的“最深的”功能(最接近网络应用启动点),因此我将“在应用启动时执行此操作”代码放在那里。是否有更深层次/更好的地方可以放入这种代码?
  3. 由于pNT模型中的节点列表为RouteConfig.RegisterRoutes,因此如何复制这些列表?如果我们有两个列表,A和B,并且让A说满,那么输入List<T>,而B列表的项目只会引用列表A中的那些,这意味着更改列表Bs项目会更改列表作为项目,反之亦然。它是否正确?我是否应该担心我复制列表的方式,或者我上面说的是假的,我可以轻松地说B = A;
  4. 这是我用自己的知识提出的缓存方式。如果已经有一种在C#/ MVC中缓存类变量的预制方法,我不会感到惊讶。如果它存在,并且您知道它,请详细说明。
  5. 修改

    问题3是实际的 - 如何将完整列表复制到空列表中,并再次从完整列表中生成项目。因为在C#中,当您放置var localList = TheHelper.CachedNavigationTree;时,当您更改(假设)B列表中的第一个项目时,该项目也将在A列表中更改。因此,对于同一列表,实际上只有2个名称,而不是RAM中的2个列表。希望这个clearars问题3.另外,回答here。对不起,我很抱歉。

1 个答案:

答案 0 :(得分:0)

1)我认为您使用MemoryCache来保存变量更明智,这仍然可以在整个应用中访问,但却是保存数据的特定设备(并且是为其设计的)。使用它也很简单。对于较旧的3.5之前的应用,您可以在Cache中找到System.Web.Caching;对于较新的应用,您可以找到MemoryCache System.Runtime.Caching。这还将为您提供一些额外的控件,如过期,可配置的大小限制,轮询间隔等。CacheMemoryCache之间的主要区别在于较新的MemoryCache也可用于工作在不直接ASP.NET

的系统下

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

3)对不起,我在这里得不到你的要求。

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