【问题标题】:.Net System.Web.Caching expiration issues.Net System.Web.Caching 过期问题
【发布时间】:2012-12-17 11:32:14
【问题描述】:

假设我有一个缓存将在一分钟后过期。

Cache.Insert("tryin", 0, null, DateTime.Now.AddSeconds(60), Cache.NoSlidingExpiration);

每 5 秒我有一个计时器将缓存值增加 1,但问题来了。如果我使用以下语法来更新缓存的值,

Cache["tryin"] = Convert.ToInt16(Cache["tryin"]) + 1;

它将覆盖缓存并使用 NoSlidingExpiration 和 NoAbsoluteExpiration 创建一个 Cache["tryin"],但我希望该缓存在一分钟后过期。 我也尝试使用以下语法,

Cache.Insert("tryin", Convert.ToInt16(Cache["tryin"]) + 1, null, DateTime.Now.AddSeconds(60), Cache.NoSlidingExpiration);

但在这种情况下,我最终会创建一个缓存,该缓存将在每 5 秒后一分钟过期,这使它不会过期。

所以我正在寻找一种方法来更新缓存值而不更改缓存过期时间,或者获取缓存的剩余过期时间,以便我可以根据剩余过期时间创建另一个。

【问题讨论】:

  • 您在这里尝试实现的用例到底是什么?修改缓存值并且更改过期时间通常被认为是非常不寻常的。例如如果数据可以缓存一分钟,并且您在 30 秒后对其进行修改.. 新值肯定是“新鲜的”,现在可以再保留一分钟吗?
  • 我知道这不是以这种方式使用缓存的“通常”情况,但我只是想知道是否有任何方法可以在不更新缓存过期时间的情况下更新缓存的值,因为显然我希望它过期,大声笑。如果没有办法缓存,请问我的替代方案是什么?

标签: c# asp.net .net


【解决方案1】:

我认为这里的问题在于缓存项是值类型。您可以将整数包装在一个类中:

public class ValueHolder
{
  public int Value = 0;
}

Cache.Insert("tryin", new ValueHolder(){Value = 0}, null, DateTime.Now.AddSeconds(60), Cache.NoSlidingExpiration);

然后

ValueHolder vh = (ValueHolder)Cache["tryin"];
if (vh != null)
  vh.Value = vh.Value + 1;

【讨论】:

  • 这也是我的建议。我见过有人在脚下开枪,忘记了如果你通过引用从缓存中获取一个对象,然后修改它,你就是在修改缓存的副本。在这种情况下,不妨利用这一事实对你有利。 :-)
猜你喜欢
  • 2018-10-07
  • 1970-01-01
  • 2011-09-27
  • 1970-01-01
  • 2011-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-11
相关资源
最近更新 更多