MemoryCache.Add 返回 true,但不会将项添加到缓存中

本文关键字:添加 缓存 返回 Add true MemoryCache | 更新日期: 2023-09-27 17:57:03

我正在尝试使用 Add 方法将项目添加到 MemoryCache.Default 实例,如下所示:

bool result= MemoryCache.Default.Add(cacheKey, dataToCache, cacheItemPolicy)

result 的值为 true,表示该项目已添加到缓存中,但当我尝试在之后立即检索它时,缓存为空。我还尝试使用 Set 方法添加该项目,结果与空缓存相同。

缓存具有默认的 99Mb 内存限制,因此看起来好像没有空间来添加新项目。

有什么想法吗?


private static void InsertCachedData(string cacheKey, object dataToCache, string[] dependantCacheKeys)
    {
        CacheItemPolicy cacheItemPolicy = new CacheItemPolicy();
        cacheItemPolicy.AbsoluteExpiration = new DateTimeOffset(DateTime.Now, new TimeSpan(hours: 0, minutes: 0, seconds: 3600));
        if (dependantCacheKeys != null && dependantCacheKeys.Length > 0)
        {
            cacheItemPolicy.ChangeMonitors.Add(MemoryCache.Default.CreateCacheEntryChangeMonitor(dependantCacheKeys));
        }
        MemoryCache.Default.Add(cacheKey, dataToCache, cacheItemPolicy);
        logger.DebugFormat("Cache miss for VehiclesProvider call with key {0}", cacheKey);
    }

MemoryCache.Add 返回 true,但不会将项添加到缓存中

没有正确设置 AbsoluteExpiration 属性。

传递给 DateTimeOffset 构造函数的TimeSpan参数应该是传递的 DateTime 值与 UTC 的偏移量,而不是要添加以生成偏移量的任意时间跨度。你在 3600 秒内通过 - 即一个小时 - 这纯粹是巧合,因为,大概,你位于英国,英国夏令时目前比 UTC 早一小时。

您将DateTime.Now作为DateTime参数传递,因此您实际上正在做的是将缓存项设置为立即过期。

如果您希望缓存的项目存活一小时,请按如下所示设置过期时间:

cacheItemPolicy.AbsoluteExpiration = new DateTimeOffset(DateTime.Now.AddHours(1));
是否可以将

策略的AbsoluteExpiration设置为零或非常小的DateTimeOffset