在项目过期后,无法将项目添加到内存缓存中

本文关键字:项目 添加 内存 缓存 过期 | 更新日期: 2023-09-27 18:06:44

我正在使用内存缓存来防止我从队列接收的消息的重新处理。

下面是我创建缓存和添加条目的方法:
        _cache = new MemoryCache("TransactionProcessorCache");
        _policy = new CacheItemPolicy
        {
            UpdateCallback = null,
            AbsoluteExpiration = DateTimeOffset.UtcNow.AddMinutes(1)
        };
        _cache.Add("unique key", "value", _policy);

我将第一项添加到缓存中,并且我可以在1分钟内检索该项,这是预期的。

但是,一旦第一个条目过期并且缓存变为空,我添加到缓存中的后续条目就无法检索。尽管从_cache.Add(…)调用中获得返回值"true",但缓存始终表现为空。

我正在使用。net Framework 4.5.1。该应用程序是一个控制台应用程序。这里的MemoryCache来自System.Runtime.Caching

在项目过期后,无法将项目添加到内存缓存中

再看一遍这一行

AbsoluteExpiration = DateTimeOffset.UtcNow.AddMinutes(1)

从当前时间 1分钟后永久禁用缓存。一分钟后,您将不得不再次重新创建策略(或者每次要添加项时都创建策略,然后它就会按照您期望的方式运行)。

看到@JD。B答案为更好的常数策略使用。

@Sinatr的回答澄清了;AbsoluteExpiration策略使策略本身过期。这意味着您需要为添加的每个项目创建一个新策略;正如@Sinatr在他的回答中所说。

同时,SlidingExpiration策略跟踪项目的最后一次访问时间,并仅在指定时间内未访问该项目时删除该项目。因此,您可以重用相同的策略,但它的行为略有不同,因为每次访问项时,项的过期计时器都会重置。

SlidingExpiration: 示例
MemoryCache cache = new MemoryCache("C");
CacheItemPolicy policy = new CacheItemPolicy
{
    UpdateCallback = null,
    SlidingExpiration = new TimeSpan(0, 0, 5)
};
cache.Add("key", "value", policy);
Console.WriteLine("1) " + cache.Get("key")); // Prints `1) value`
System.Threading.Thread.Sleep(5250); // Wait for "key" to expire
Console.WriteLine("2) " + cache.Get("key")); // Prints `2) `
// Just showing the the cache policy still works once an item expires.
cache.Add("key2", "value2", policy);
Console.WriteLine("3) " + cache.Get("key2")); // Prints `3) value2`
System.Threading.Thread.Sleep(5250); // Wait for "key2" to expire
Console.WriteLine("4) " + cache.Get("key2")); // Prints `4) `