首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >大对象缓存

大对象缓存
EN

Stack Overflow用户
提问于 2009-03-09 17:40:45
回答 4查看 1.6K关注 0票数 1

我有一个.NET2.0 C# web应用程序。它具有数量可变的大型初始开销对象,这些对象在多个请求之间共享,但不会分配给任何给定的用户。因此,我需要在一个查找结构中持久化它们。这些对象需要根据需要创建,而不是应用程序的生命周期所必需的,只需要它们的使用寿命。

再加一点。

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

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-03-09 17:43:48

我不确定为什么HttpRuntime cache不能在这里工作。插入到缓存中的项将在每次被触摸时被“更新”,从而使它们保持存活,直到不再需要它们;在此之后,它们将继续留在缓存中,直到它们过期(滑动或滚动时间)或由于内存压力而被迫退出。它们还可以在显式设置的绝对时间强制退出,而不考虑使用情况:

滚动时间:在系统时钟超过一定的滚动时间( DateTime

  • Sliding (
  • Absolute ))后,项目被强制退出:每次项目被触摸时,其死亡倒计时将被重置。倒计时的持续时间是滑动时间(例如,5分钟)。

示例用法:

代码语言:javascript
复制
//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);
票数 5
EN

Stack Overflow用户

发布于 2009-03-09 17:43:48

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

例如:(我认为这是完整的语法

代码语言:javascript
复制
Cache.Add("myKey", MyLargeObject, null, DateTime.Now.AddMinutes(10), Cache.SlidingExpiration, CacheItemPriority.High)
票数 1
EN

Stack Overflow用户

发布于 2009-03-09 17:45:41

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/627267

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档