具有绝对过期的内存缓存存储在 IOC 容器中,使用 .SingleInstance()

本文关键字:使用 SingleInstance IOC 过期 存储 缓存 内存 | 更新日期: 2023-09-27 17:58:10

我对MemoryCache有一个抽象,这个实例使用AbsoluteExpiration作为其CacheItemPolicy,由Autofac管理如下:

builder
    .RegisterType<MyCache>()
    .As<IMyCache>()
    .SingleInstance()
    .WithParameter("cacheName", "MyCache");

从理论上讲,我希望这些项目绝对过期(例如在 15 分钟内(。

问题

(问题(是,它是所有请求的单个实例,并且没有适当的机制可以将过期时间再次重置为将来的 15 分钟。所以刷新只会发生一次,对吧?

对此的解决方案是什么?我需要挂接到一个事件或其他东西吗?

具有绝对过期的内存缓存存储在 IOC 容器中,使用 .SingleInstance()

缓存项目策略基于每个项目工作。添加项目,它将在 15 分钟后过期(根据您的项目策略(。无需"重置"或任何要求。它不像计时器或信号量那样工作 - 添加内容,缓存处理其余部分。

您可以通过使策略足够短(一分钟?(添加内容并等待来测试这一点。

我的问题是我需要指定缓存键过期的某个时间点:

AbsoluteExpiration = DateTimeOffset.UtcNow.AddMinutes(15)

缓存策略是在private readonly field中设置的,该仅在创建MyCache实例时初始化,但这仅在应用程序启动(IoC 容器,单个实例(时发生。

这现在对我有用:

private CacheItemPolicy CachePolicy => new CacheItemPolicy
{
    AbsoluteExpiration = DateTimeOffset.UtcNow.AddMinutes(15)
};

每次访问缓存项策略时,都会计算一个新的DateTimeOffset