【问题标题】:Why is sliding expiration in MemoryCache acting so strange?为什么 MemoryCache 中的滑动过期行为如此奇怪?
【发布时间】:2014-04-09 11:01:37
【问题描述】:

我不明白在 System.Runtime.Caching.MemoryCache 和 .NET 4.0 中应该如何滑动到期。

根据文档,过期时间跨度是“在将缓存条目从缓存中逐出之前必须访问缓存条目的时间跨度。”

但是下面的单元测试失败了:

private const string AnyKey = "key";
private const string AnyValue = "value";

private readonly TimeSpan timeout = TimeSpan.FromSeconds(0.5);

private void WaitSixtyPercentOfTheTimeout()
{
    Thread.Sleep(TimeSpan.FromSeconds(timeout.TotalSeconds*0.6));
}

[Test]
public void Get_RefreshesTimeoutOfSlidingExpiration()
{
    var cache = MemoryCache.Default;
    cache.Set(AnyKey, AnyValue, new CacheItemPolicy {SlidingExpiration = timeout});

    WaitSixtyPercentOfTheTimeout();
    cache[AnyKey].Should().Be(AnyValue);
    WaitSixtyPercentOfTheTimeout();

    cache[AnyKey].Should().Be(AnyValue);
}

private void UpdateCallback(CacheEntryUpdateArguments arguments)
{
}

巧合的是,我做了一个小改动来解决这个问题。但是,如果它是错误或功能,现在有人吗?

一旦设置了 UpdateCallBack,过期就会按预期工作:

// [...]

[Test]
public void Get_RefreshesTimeoutOfSlidingExpiration()
{
    var cache = MemoryCache.Default;
    cache.Set(AnyKey, AnyValue, new CacheItemPolicy {SlidingExpiration = timeout, UpdateCallback = UpdateCallback});

    WaitSixtyPercentOfTheTimeout();
    cache[AnyKey].Should().Be(AnyValue);
    WaitSixtyPercentOfTheTimeout();

    cache[AnyKey].Should().Be(AnyValue);
}

private void UpdateCallback(CacheEntryUpdateArguments arguments)
{
}

【问题讨论】:

    标签: c# .net caching memorycache


    【解决方案1】:

    延长超时时间似乎可以解决问题。让它在我的机器上运行 2 秒:

    private readonly TimeSpan timeout = TimeSpan.FromSeconds(2);
    

    我猜目前的缓存机制在时间上不是很准确,但实际上你不会把缓存保持半秒。

    【讨论】:

    • 这很奇怪,但似乎是正确的解决方案。我认为 SlidingExpiration 设置对我不起作用,直到我开始在测试中使用超过 1 秒的过期时间。
    • 为了保持这个答案的有用性 - stackoverflow.com/questions/41395490/… 检查 System.Runtime.Caching 中的一些代码,确定最短 1 秒。
    猜你喜欢
    • 2012-09-19
    • 1970-01-01
    • 2021-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-26
    • 1970-01-01
    • 2018-07-21
    相关资源
    最近更新 更多