【问题标题】:MemoryCache EvictionCallback never called [duplicate]MemoryCache EvictionCallback 从未调用过[重复]
【发布时间】:2019-12-20 17:25:07
【问题描述】:

.Net 核心内存缓存。我希望在从缓存中删除项目时收到通知。实施此示例后: https://docs.microsoft.com/en-us/aspnet/core/performance/caching/memory?view=aspnetcore-3.1

=> CreateCallbackEntry()。当我在

中放置断点时

驱逐回调:

private static void EvictionCallback(object key, object value,
    EvictionReason reason, object state)
{
    var message = $"Entry was evicted. Reason: {reason}.";
    // i should reach this after 10 seconds
}

只有在尝试再次读取刚刚存储在缓存中的相同键时才会触发断点。否则,即使网页保持打开状态,也不会调用该驱逐方法。

控制器:

    public void OnGet()
    {
        _cache.GetOrCreate("key", item);

        // eviction callback does not fire until I query for the same key again below
        var t = _cache.GetOrCreate("key", item)
    }

缓存:

var cacheEntryOptions = new MemoryCacheEntryOptions()
    .SetAbsoluteExpiration(TimeSpan.FromSeconds(10))
    .RegisterPostEvictionCallback(callback: EvictionCallback, state: this);

cacheEntry = await createItem();
_cache.Set(key, cacheEntry, cacheEntryOptions);

【问题讨论】:

  • 您只是希望在超时后执行回调吗?这不是它的工作原理,您需要查询缓存中的项目,然后它会调用它。
  • 嗯。我知道了。有没有办法以某种方式修改它以实现这一目标?
  • 这行得通!。非常感谢
  • 我猜这是重复的,我会关闭它:)

标签: c# .net memorycache


【解决方案1】:

PostEvicionCallback 不是过期事件。

当缓存条目从 缓存,而不是过期。

过期条目的删除是在过期后延迟完成的 对缓存的操作。这就是为什么回调在你的下一个执行 过期后请求。出于性能考虑,我们删除 批次中的过期项目,其最短期限由 MemoryCacheOptions.ExpirationScanFrequency。

我们目前没有公开任何机制来准确通知何时缓存 条目过期,但过期的条目最终会触发 任何缓存操作后的某个时间的过期回调。

来自github.com/aspnet/Caching

您可以尝试降低 MemoryCacheOptions.ExpirationScanFrequency,但要注意性能影响。默认值为 1 分钟。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-16
    • 2021-04-14
    • 1970-01-01
    • 2011-10-16
    • 2023-03-19
    • 2015-01-05
    • 2013-09-28
    • 2019-08-13
    相关资源
    最近更新 更多