.NET 9 Preview 1 中 MemoryCache 的更新

💡 原文中文,约4100字,阅读约需10分钟。
📝

内容提要

.NET 9 Preview 1中为MemoryCache添加了Keys属性,可以获取缓存的key列表。新增了带MemoryCacheEntryOptions参数的GetOrCreate(Async)重载方法。示例展示了使用示例和依赖注入的示例。新增的API定义了GetOrCreate方法的MemoryCacheEntryOptions参数,可以设置缓存的过期时间等。示例展示了设置和不设置过期时间的区别。

🔎

延伸解读

Keys 属性:接口与实现的差异

新增的 Keys 属性定义在 MemoryCache 类上,而 IMemoryCache 接口并未包含它。这意味着通过依赖注入获取的 IMemoryCache 实例需要强制转换为 MemoryCache 才能访问 Keys。这种设计可能影响代码的抽象性和可测试性,开发者需注意类型转换带来的耦合。

GetOrCreate 重载:简化缓存配置

新的 GetOrCreate 和 GetOrCreateAsync 重载方法增加了 MemoryCacheEntryOptions 参数,允许在获取或创建缓存项时直接设置过期时间等选项。这避免了在 factory 方法内部手动配置缓存项,使代码更简洁,尤其适合需要动态设置不同过期策略的场景。

过期策略的实际影响

示例对比了设置与不设置过期时间的缓存行为:设置 3 秒绝对过期的缓存项在过期后会重新执行 factory 从数据源获取,而未设置过期时间的缓存项仅在首次创建时获取。这提醒开发者根据数据更新频率合理设置过期时间,以平衡性能与数据新鲜度。

❓

Q&A

.NET 9 Preview 1 中 MemoryCache 新增了哪些功能?

新增了 Keys 属性,用于获取缓存中的键列表;还新增了带 MemoryCacheEntryOptions 参数的 GetOrCreate 和 GetOrCreateAsync 重载方法。

如何使用 MemoryCache 的 Keys 属性获取所有缓存键?

可以通过 MemoryCache 实例的 Keys 属性获取所有缓存键,例如:foreach (var key in memoryCache.Keys) { Console.WriteLine(key); }。注意 Keys 属性定义在 MemoryCache 类上,如果使用 IMemoryCache 接口,需要转换为 MemoryCache 类型。

在依赖注入场景下如何使用 MemoryCache 的 Keys 属性?

通过依赖注入获取 IMemoryCache 实例后,需要将其强制转换为 MemoryCache 类型才能访问 Keys 属性,例如:((MemoryCache)memoryCache).Keys。

新的 GetOrCreate 方法有什么作用?

新的 GetOrCreate 方法增加了 MemoryCacheEntryOptions 参数,可以在创建缓存项时设置过期时间等选项,从而简化 factory 方法的逻辑。

如何为 GetOrCreate 创建的缓存设置过期时间?

可以通过传递 MemoryCacheEntryOptions 参数来设置,例如:memoryCache.GetOrCreate(key, factory, new MemoryCacheEntryOptions() { AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(3) })。

设置和不设置过期时间在 GetOrCreate 中有什么区别?

设置过期时间后,缓存项会在指定时间后失效,再次调用 GetOrCreate 时会重新执行 factory 方法获取新值;不设置过期时间则缓存项永久有效,除非手动移除。

🏷️

标签

➡️

继续阅读