代码之家  ›  专栏  ›  技术社区  ›  annakata

大对象缓存

  •  1
  • annakata  · 技术社区  · 17 年前

    我有一个.NET2.0c#web应用程序。它有数量可变的大型、init昂贵的对象,这些对象在多个请求中共享,但不会对任何给定用户进行会话。因此,我需要将它们保存在查找结构中。这些对象需要根据需要创建,而不是应用程序的生命周期所必需的,只是它们的使用寿命。

    再加一点。

    内存泄漏的方法是一个简单的字典,内存安全的方法是一个弱引用支持的字典,但是我的问题是GC太快了。实际上,这可能不是一个问题,因为对象的通信量应该是这样的,即它们将保持活动状态,而不会被迫太多地重新生成,但理想情况下,我希望它们也能按比例缩小。

    有没有一种我没有想到的中间解决方案,它可以使对象在一段时间X内安全地隐藏在GC之外,但也允许在该时间结束时收集它们,最好是在每次以类似于会话令牌的方式使用时重置时间计数器?

    4 回复  |  直到 17 年前
        1
  •  5
  •   Rex M    17 年前

    我不知道为什么会这样 HttpRuntime cache 我不在这里工作。插入到缓存中的项目将在每次触摸时“更新”,从而使它们保持活动状态,直到不再需要它们为止;之后,它们将继续留在缓存中,直到过期(滑动或滚动时间)或由于内存压力而被迫退出。它们也可以在明确设置的绝对时间强制退出,无论使用情况如何:

    • :在系统时钟经过特定日期时间后,项目被强制退出

    • 滑动(滚动)时间 :每次触摸物品时,其死亡倒计时将重置。倒计时的持续时间是滑动时间(例如,5分钟)。

    用法示例:

    //adds itemObject to cache under name "UniqueItemKey"
    //set to expire 5 minutes after last touched
    HttpRuntime.Cache.Add("UniqueItemKey", 
                          itemObject, 
                          null,
                          Cache.NoAbsoluteExpiration,
                          new TimeSpan(0, 5, 0),
                          CacheItemPriority.Normal,
                          null);
    
        2
  •  1
  •   Mitchel Sellers    17 年前

    为什么不使用框架中的缓存对象并在其上设置滑动过期时间。10分钟吧。如果至少每10分钟使用一次,它将保留在缓存中,如果10分钟过去,它将过期,GC将删除它。

    Cache.Add("myKey", MyLargeObject, null, DateTime.Now.AddMinutes(10), Cache.SlidingExpiration, CacheItemPriority.High)
    
        3
  •  1
  •   Jon Skeet    17 年前

    关键部分是“它们的使用寿命”。你如何定义它?如果你能以一种不需要了解未来的方式精确地定义它,那么剩下的可能就很容易了。

        4
  •  0
  •   Brian    17 年前

    听起来你已经在描述你自己问题的解决方案了;一种缓存结构,它在一段时间内保持强引用,但如果某段时间没有“访问”对象,则会将它们降级为弱引用。