【问题标题】:Cache or Application variable to store list of objects?缓存或应用程序变量来存储对象列表?
【发布时间】:2013-05-29 17:59:14
【问题描述】:

在我的应用程序中,我将一些 xml 文件读入对象列表 (List<Thing>),但我想避免每次请求都访问文件系统。 xml 文件中的数据很少更改,所以我想以某种方式对其进行缓存。在应用程序启动时加载数据或延迟加载数据,对我来说都很好。我将需要能够在整个应用程序中使用数据并对其运行 Linq 查询,几乎将其用作内存中的迷你数据库。我需要能够在不影响缓存版本的情况下更改/更新数据,因此可能还需要将数据复制到局部变量。我怎样才能做到这一点?

【问题讨论】:

  • 你不是已经在List<Thing>缓存了吗?
  • 对,但我希望它在请求之间可供所有用户使用。

标签: c# asp.net caching application-start


【解决方案1】:

你可以使用缓存对象。

myxmllist = HttpContext.Current.Cache["myxmllist"];

    if (myxmllist == null)
    {
        //get xml from server

        HttpContext.Current.Cache.Insert("myxmllist", myxmllist); // add it to cache
    }

【讨论】:

  • 该数据结构线程安全吗(即使用时不需要lock)?
  • @MichaelPerrenoud 访问缓存本身是安全的。如果您将一个对象存储在缓存中,该对象并非旨在用于多个线程,那么您可能会遇到问题。在这种情况下,重要的是要么使用来自 Concurrent 命名空间的集合,要么确保您只读取缓存中的数据(这是线程安全的)而不是写入数据。
  • @Servy,非常感谢!我一直在建立自己的。澄清一下,当您说 or ensure that you only ever read from data in the cache 时,意味着您将在 Global.asax (常见)仅在某些内容不正确时才添加加载所有缓存?
  • @MichaelPerrenoud 否。这意味着您可以将缓存的值设置为一个全新的列表而不会出现问题,您只是不应该从缓存中获取列表然后改变列表。该列表并非旨在从多个线程中进行变异,也不是在读取时发生变异。
  • 有没有办法将缓存的值复制到局部变量以进行更改/变异?尽管我将值分配给了一个局部变量,但我看到该值在多个线程中得到更新和持久化。
【解决方案2】:

System.Runtime.Caching.MemoryCacheSystem.Web.Caching.Cache 的主要优点之一是能够为您缓存的项目设置过期策略。如果您打算只加载一次数据并在进程的整个生命周期内将其保存在内存中,您还可以使用您创建的静态类成员并在同一类的静态构造函数中填充数据。如果您的更改/更新操作不应影响内存中的数据,则需要将数据加载(或复制)到容器的另一个实例中并更改(并可能保存)它。

【讨论】:

    猜你喜欢
    • 2018-06-07
    • 2014-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多