MemoryCache小结
原文链接:https://blog.csdn.net/weixin_46598480/article/details/142847296
文章目录
MemoryCache
一、使用内存缓存的基本步骤
内存缓存的适用场景
注意事项
二、MemoryCacheOptions
三、MemoryCacheEntryOptions
四、CacheExtensions
MemoryCache
在 ASP.NET Core 中,内存缓存(Memory Cache)是一种在应用程序内存中存储数据的机制,用于临时存储经常访问的数据,从而减少对外部数据源(如数据库)的频繁访问。这种缓存方式能够显著提高应用程序的性能,特别是在处理需要频繁查询但数据更新不频繁的场景。
其在命名空间:Microsoft.Extensions.Caching.Memory,是IMemoryCache的实现,它是实际存储和管理缓存数据的地方。通过 MemoryCache,可以直接对缓存进行添加、读取和删除操作。
一、使用内存缓存的基本步骤
1、添加内存缓存服务: 在 Startup.cs 中,通过依赖注入将内存缓存服务添加到应用程序中。
public void ConfigureServices(IServiceCollection services) { services.AddMemoryCache(); }
2、注入和使用内存缓存: 在你的控制器(controller)或服务(service)中注入 IMemoryCache
接口,并使用它来存储和检索缓存数据。
public class MyController : Controller { private readonly IMemoryCache _memoryCache; public MyController(IMemoryCache memoryCache) { _memoryCache = memoryCache; } public IActionResult Index() { // 尝试从缓存中获取数据 if (!_memoryCache.TryGetValue("myKey", out string cachedData)) { // 缓存中没有数据时,从数据源获取数据 cachedData = "This is the data to cache"; // 设置缓存选项,如过期时间 var cacheEntryOptions = new MemoryCacheEntryOptions() .SetSlidingExpiration(TimeSpan.FromMinutes(5)); // 将数据存入缓存 _memoryCache.Set("myKey", cachedData, cacheEntryOptions); } return Content(cachedData); } }
3、缓存选项: 在设置缓存时,可以指定一些缓存选项,如
-
绝对过期时间 (
SetAbsoluteExpiration
):指定缓存项在某个时间点过期。 -
滑动过期时间 (
SetSlidingExpiration
):指定如果缓存项在一定时间内未被访问,则过期。var cacheEntryOptions = new MemoryCacheEntryOptions() .SetAbsoluteExpiration(TimeSpan.FromHours(1)) .SetSlidingExpiration(TimeSpan.FromMinutes(10));
4、删除缓存项: 可以通过
Remove
方法来手动移除缓存项_memoryCache.Remove("myKey");
内存缓存的适用场景
内存缓存适用于以下场景:
读多写少的场景:数据读取频繁但更新较少,如配置数据、静态数据等。
会话级数据:一些用户会话数据可以存储在内存中,以提高访问速度。
缓存查询结果:避免频繁查询数据库,提高查询性能。
注意事项
内存占用:缓存存储在服务器内存中,因此缓存过多数据可能导致服务器内存不足,需要设置合理的缓存策略。
多服务器环境:在负载均衡的多服务器环境中,内存缓存是特定于单个服务器的。可以考虑使用分布式缓存(如 Redis)来实现跨服务器的共享缓存。
二、MemoryCacheOptionsmemoryCacheOptions
是用于配置MemoryCache
的类,它控制了缓存的整体行为和资源管理。通过自定义这个选项,可以控制缓存的大小、过期策略以及其他一些性能调优的参数。
属性 | 功能 |
---|---|
Clock | 获取或设置缓存用于过期的时钟。 |
CompactionPercentage | 获取或设置在超出最大大小时要压缩的缓存量。 |
CompactOnMemoryPressure | 已过时,获取或设置连续扫描过期项之间的最小时间长度。 |
ExpirationScanFrequency | 获取或设置连续扫描过期项之间的最小时间长度。 |
SizeLimit | 获取或设置缓存的最大大小。 |
TrackLinkedCacheEntries | 获取或设置一个值,该值指示是否跟踪链接条目。 |
TrackStatistics |
获取或设置是否跟踪内存缓存统计信息。 默认已禁用。 |
SizeLimit
:设置缓存的大小限制(以任意单位表示),**默认情况下,缓存是无大小限制的。**如果设置了大小限制,则每个缓存项的 Size
也必须设置。var memoryCacheOptions = new MemoryCacheOptions { SizeLimit = 1024 // 限制为 1024 个缓存单位 };
CompactionPercentage
:当内存压力较大时,ASP.NET Core 会清理缓存中的数据。这个属性定义了每次清理时,缓存中多少百分比的数据会被逐出。
var memoryCacheOptions = new MemoryCacheOptions { CompactionPercentage = 0.25 // 清理缓存的25% };
ExpirationScanFrequency
:控制过期缓存项的扫描频率。默认情况下,ASP.NET Core 会定期扫描缓存项,并删除过期项。可以通过设置这个属性来调节扫描的频率。
var memoryCacheOptions = new MemoryCacheOptions { ExpirationScanFrequency = TimeSpan.FromMinutes(5) // 每5分钟扫描一次过期项 };
MemoryCacheOptions
主要用于在应用程序启动时对缓存系统进行全局配置。
三、MemoryCacheEntryOptions
MemoryCacheEntryOptions
用于配置每个缓存项的行为,例如其过期时间、优先级以及其他特定于该缓存项的选项。
属性 | 功能 |
---|---|
AbsoluteExpiration | 获取或设置缓存项的绝对到期日期。 |
AbsoluteExpirationRelativeToNow | 获取或设置相对于当前时间的绝对到期时间。 |
ExpirationTokens | 获取导致缓存项过期的 IChangeToken 实例。 |
PostEvictionCallbacks | 获取或设置从缓存中逐出缓存项后将触发的回调。 |
Priority | 获取或设置在内存压力触发的清理过程中保留缓存中的缓存项的优先级。 默认值为 Normal 。 |
Size | 获取或设置缓存项值的大小。 |
SlidingExpiration | 获取或设置缓存项在被删除之前可以处于停用状态(例如不被访问)的时长。 这不会将项生存期延长到超过绝对到期时间(如果已设置)。 |
AbsoluteExpiration
:指定缓存项的绝对过期时间。到达此时间后,缓存项将被自动移除。var cacheEntryOptions = new MemoryCacheEntryOptions { AbsoluteExpiration = DateTimeOffset.Now.AddHours(1) // 1小时后过期 };
SlidingExpiration
:设置滑动过期时间。如果在此时间段内没有访问该缓存项,则缓存项将过期。
var cacheEntryOptions = new MemoryCacheEntryOptions { SlidingExpiration = TimeSpan.FromMinutes(30) // 30分钟内未被访问则过期 };
Priority
:缓存项的优先级,控制当缓存被清理时该项的优先级。可以选择 CacheItemPriority
枚举值,如 Low
、Normal
、High
和 NeverRemove
。
var cacheEntryOptions = new MemoryCacheEntryOptions { Priority = CacheItemPriority.High // 高优先级 };
Size
:如果启用了缓存大小限制,则需要为每个缓存项设置 Size
属性。这是一个任意的单位值,供开发者根据需要定义。
var cacheEntryOptions = new MemoryCacheEntryOptions { Size = 10 // 设置缓存项大小 };
PostEvictionCallbacks
:设置缓存项被逐出缓存时的回调方法。
var cacheEntryOptions = new MemoryCacheEntryOptions(); cacheEntryOptions.RegisterPostEvictionCallback((key, value, reason, state) => { // 执行回调逻辑 });
PostEvictionCallbacks
:设置缓存项被逐出缓存时的回调方法。
var cacheEntryOptions = new MemoryCacheEntryOptions(); cacheEntryOptions.RegisterPostEvictionCallback((key, value, reason, state) => { // 执行回调逻辑 });
四、CacheExtensions
CacheExtensions
提供了一组便捷的扩展方法,使得 IMemoryCache
的操作更加简洁易用。
方法 | 功能 |
---|---|
Get(IMemoryCache, Object) | 获取与此键关联的值(如果存在)。 |
Get(IMemoryCache, Object) | 获取与此键关联的值(如果存在)。 |
GetOrCreate(IMemoryCache, Object, Func<ICacheEntry,T>) | 获取与此键关联的值(如果存在);如果未找到密钥,则使用提供的键和给定工厂中的值生成一个新条目。 |
GetOrCreateAsync(IMemoryCache, Object, Func<ICacheEntry,Task>) | 如果存在,则异步获取与此键关联的值,或者在找不到密钥时使用提供的键和给定工厂中的值生成新条目。 |
Set(IMemoryCache, Object, T) | 将值与 IMemoryCache 中的指定键相关联。 |
Set(IMemoryCache ,Object, T, DateTimeOffset) | 创建或覆盖缓存中的指定条目,并设置具有绝对过期日期的值。 |
Set(IMemoryCache, Object, T, IChangeToken) | 将缓存项与指定的密钥相关联,该项将在 IChangeToken 过期时过期。 |
Set(IMemoryCache, Object, T, MemoryCacheEntryOptions) | 将缓存项与指定的键相关联,并将现有 MemoryCacheEntryOptions 的值应用于创建的项。 |
Set(IMemoryCache, Object, T, TimeSpan) | 将缓存项与指定密钥相关联,该键将在指定持续时间后过期。 |
TryGetValue(IMemoryCache, Object, T) | 尝试获取与指定键关联的值。 |
GetOrCreate
:尝试从缓存中获取项,如果不存在,则使用提供的委托创建并缓存该项。var cachedData = cache.GetOrCreate("myKey", entry => { entry.SlidingExpiration = TimeSpan.FromMinutes(5); return "This is cached data"; });
GetOrCreateAsync
:异步版本的 GetOrCreate
。
var cachedData = await cache.GetOrCreateAsync("myKey", async entry => { entry.SlidingExpiration = TimeSpan.FromMinutes(5); return await Task.FromResult("This is cached data"); });
TryGetValue
:尝试从缓存中获取项,如果存在则返回值。
if (cache.TryGetValue("myKey", out string cachedData)) { // 使用缓存数据 }
dingExpiration = TimeSpan.FromMinutes(5);
return await Task.FromResult(“This is cached data”);
});
**`TryGetValue`**:尝试从缓存中获取项,如果存在则返回值。 ```c# if (cache.TryGetValue("myKey", out string cachedData)) { // 使用缓存数据 }
在 ASP.NET Core 中,MemoryCache 通过灵活的 MemoryCacheOptions 和 MemoryCacheEntryOptions 为开发者提供了高度可定制的缓存管理方式。而 CacheExtensions 则为常用的缓存操作提供了简化的 API。通过合理使用这些功能,可以极大地提高应用程序的性能和响应速度。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET10 - 预览版1新功能体验(一)