C# MemoryCache-绝对过期-项目在更新后不过期**

C# MemoryCache-绝对过期-项目在更新后不过期**,c#,memorycache,C#,Memorycache,下面是缓存用户无效登录尝试的代码。正在使用“绝对过期”缓存策略将项添加到缓存中 如果我只添加一项,它将在2分钟内到期。但是如果我更新缓存项(没有显式指定缓存策略),则该项的保留时间将远远超过2分钟。以下是代码片段: public class UserLogin { public string Username { get; set; } public List<DateTime> InvalidLoginTimestamp { get; set; } publ

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

如果我只添加一项,它将在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;
}
公共类用户登录
{
公共字符串用户名{get;set;}
公共列表InvalidLoginItemStamp{get;set;}
公共bool已锁定{get;set;}
}    
专用void AddInvalidLoginToCache(字符串缓存密钥)
{
if(invalidLoginCache.Contains(cacheKey))
{
//将无效登录添加到缓存
UserLogin invalidLogin=(UserLogin)invalidLoginCache[cacheKey];
invalidLogin.invalidLoginItemStamp.Add(DateTime.Now);
invalidLoginCache[cacheKey]=invalidLogin;
//如果无效登录达到阈值,则锁定用户帐户
if(invalidLogin.invalidLoginItemStamp.Count==3)
{
invalidLogin.IsLocked=true;
Set(cacheKey,invalidLogin,getcachepolicyforlocket());
}
}
其他的
{
invalidLoginCache.Add(缓存键,
新用户登录{Username=cacheKey,invalidLoginItemStamp=new List{DateTime.Now},
GetCachePolicyForInvalidLogin());
}
}
private CacheItemPolicy GetCachePolicyForInvalidLogin()
{
int keepinValidLogin=2;//分钟
CacheItemPolicy cachePolicyForInvalidLogin=new CacheItemPolicy{AbsoluteExpiration=DateTimeOffset.Now.AddMinutes(KeepInValidLogin)};
返回cachePolicyForInvalidLogin;
}
问题似乎与我何时更新//Add invalid login to cache下的缓存项有关

关于我在这里遗漏了什么以及如何解决这个问题,有什么想法吗?

ILSpy透露:

invalidLoginCache[cacheKey] = invalidLogin;
相当于:

invalidLoginCache.Set(
    cacheKey, invalidLogin, 
    ObjectCache.InfiniteAbsoluteExpiration, null);
这能解释你看到了什么吗

为什么不调用Set,传递一个显式策略?

ILSpy显示:

invalidLoginCache[cacheKey] = invalidLogin;
相当于:

invalidLoginCache.Set(
    cacheKey, invalidLogin, 
    ObjectCache.InfiniteAbsoluteExpiration, null);
这能解释你看到了什么吗


为什么不调用Set,传递一个明确的策略?

您说“项目保持的时间比预期的长”。你期待什么?你看到了什么?你说“这个项目仍然比预期的要长”。您期望得到什么,看到了什么?仅供参考,Microsoft已更新,您无需再使用ILSpy即可查看.NET源代码(您甚至可以)是的,它确实帮助我理解花费更长时间的原因。我正在更新为“invalidLoginCache[cacheKey]=invalidLogin;”,因为我希望invalidLogin缓存项在第一次无效登录尝试的基础上过期。如果我使用Set方法,它将在第三次无效登录尝试的基础上过期-3是用户允许的最大无效登录次数。如果我想在第一次无效尝试的基础上使缓存过期,您看到了任何解决方法吗?@user1552869-在这种情况下,我根本不明白为什么您有“invalidLoginCache[cacheKey]=invalidLogin;”这一行。您向已经缓存的invalidLogin对象添加了一个时间戳——这还不够吗?哦,天才,确实足够了。没有意识到更新对象就足够了。非常感谢。仅供参考,Microsoft进行了更新,因此您无需再使用ILSpy即可查看.NET源代码(您甚至可以)是的,它确实帮助我理解花费更长时间的原因。我正在更新为“invalidLoginCache[cacheKey]=invalidLogin;”,因为我希望invalidLogin缓存项在第一次无效登录尝试的基础上过期。如果我使用Set方法,它将在第三次无效登录尝试的基础上过期-3是用户允许的最大无效登录次数。如果我想在第一次无效尝试的基础上使缓存过期,您看到了任何解决方法吗?@user1552869-在这种情况下,我根本不明白为什么您有“invalidLoginCache[cacheKey]=invalidLogin;”这一行。您向已经缓存的invalidLogin对象添加了一个时间戳——这还不够吗?哦,天才,确实足够了。没有意识到更新对象就足够了。非常感谢。