MemoryCache - AbsoluteExpiration - 更新后项目不会过期*

时间:2014-03-17 17:07:32

标签: c# memorycache

以下是用于缓存用户进行的无效登录尝试的代码。正在使用“绝对过期”缓存项目添加到缓存中缓存策略。

如果我只添加一个项目 - 它会在2分钟内按预期到期。但是,如果我更新该缓存项目(没有明确指定缓存策略) - 该项目仍然超过2分钟。以下是代码段:

public class UserLogin
{
    public string Username { get; set; }
    public List<DateTime> InvalidLoginTimestamp { get; set; }
    public bool IsLocked { get; set; }
}    

private void AddInvalidLoginToCache(string cacheKey)
{
    if (invalidLoginCache.Contains(cacheKey))
    {
        //Add invalid login to cache
        UserLogin invalidLogin = (UserLogin)invalidLoginCache[cacheKey];
        invalidLogin.InvalidLoginTimestamp.Add(DateTime.Now);
        invalidLoginCache[cacheKey] = invalidLogin;

        //Lock user account if invalid logins reach threshold
        if (invalidLogin.InvalidLoginTimestamp.Count == 3)
        {
            invalidLogin.IsLocked = true;
            invalidLoginCache.Set(cacheKey, invalidLogin, GetCachePolicyForLockOut());
        }
    }
    else
    {
        invalidLoginCache.Add(cacheKey,
                                new UserLogin { Username = cacheKey, InvalidLoginTimestamp = new List<DateTime> { DateTime.Now } },
                                GetCachePolicyForInvalidLogin());
    }
}

private CacheItemPolicy GetCachePolicyForInvalidLogin()
{
    int keepInvalidLoginFor = 2; //minutes
    CacheItemPolicy cachePolicyForInvalidLogin = new CacheItemPolicy { AbsoluteExpiration = DateTimeOffset.Now.AddMinutes(keepInvalidLoginFor) };
    return cachePolicyForInvalidLogin;
}

似乎问题与我在//添加无效登录到缓存

下的缓存项目时有关

关于我在这里缺少什么的想法以及如何解决这个问题?

1 个答案:

答案 0 :(得分:5)

ILSpy透露:

invalidLoginCache[cacheKey] = invalidLogin;

相当于:

invalidLoginCache.Set(
    cacheKey, invalidLogin, 
    ObjectCache.InfiniteAbsoluteExpiration, null);

这能解释您所看到的内容吗?

为什么不拨打Set,传递明确的政策?