gpt4 book ai didi

ASP.net 缓存绝对过期不起作用

转载 作者:行者123 更新时间:2023-12-02 20:46:30 25 4
gpt4 key购买 nike

我在 HttpContext.Cache 中存储单个整数值,绝对过期时间为从现在起 5 分钟。然而,等待 6 分钟(或更长时间)后,整数值仍然在缓存中(即,即使绝对过期已经过去,它也永远不会被删除)。这是我正在使用的代码:

public void UpdateCountFor(string remoteIp)
{
// only returns true the first time its run
// after that the value is still in the Cache
// even after the absolute expiration has passed
// so after that this keeps returning false
if (HttpContext.Current.Cache[remoteIp] == null)
{
// nothing for this ip in the cache so add the ip as a key with a value of 1
var expireDate = DateTime.Now.AddMinutes(5);
// I also tried:
// var expireDate = DateTime.UtcNow.AddMinutes(5);
// and that did not work either.
HttpContext.Current.Cache.Insert(remoteIp, 1, null, expireDate, Cache.NoSlidingExpiration, CacheItemPriority.Default, null);
}
else
{
// increment the existing value
HttpContext.Current.Cache[remoteIp] = ((int)HttpContext.Current.Cache[remoteIp]) + 1;
}
}

我第一次运行 UpdateCountFor("127.0.0.1") 时,它会使用键“127.0.0.1”将 1 插入到缓存中,并且按预期从现在起绝对过期 5 分钟。随后的每次运行都会增加缓存中的值。然而,等待 10 分钟后,它会继续增加缓存中的值。该值永远不会过期,也永远不会从缓存中删除。这是为什么?

据我了解,绝对过期时间意味着该项目将在大约那个时间被删除。难道我做错了什么?我是不是误会了什么?

我预计该值会在 5 分钟后从缓存中删除,但它会保留在那里,直到我重建项目。

这一切都在我本地计算机上的 .NET 4.0 上运行。

最佳答案

事实证明这一行:

HttpContext.Current.Cache[remoteIp] = ((int)HttpContext.Current.Cache[remoteIp]) + 1;

删除以前的值并重新插入该值,没有绝对或滑动过期时间。为了解决这个问题,我必须创建一个辅助类并像这样使用它:

public class IncrementingCacheCounter
{
public int Count;
public DateTime ExpireDate;
}

public void UpdateCountFor(string remoteIp)
{
IncrementingCacheCounter counter = null;
if (HttpContext.Current.Cache[remoteIp] == null)
{
var expireDate = DateTime.Now.AddMinutes(5);
counter = new IncrementingCacheCounter { Count = 1, ExpireDate = expireDate };
}
else
{
counter = (IncrementingCacheCounter)HttpContext.Current.Cache[remoteIp];
counter.Count++;
}
HttpContext.Current.Cache.Insert(remoteIp, counter, null, counter.ExpireDate, Cache.NoSlidingExpiration, CacheItemPriority.Default, null);
}

这将解决该问题,让计数器在绝对时间正确过期,同时仍启用对其更新。

关于ASP.net 缓存绝对过期不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5902255/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com