缓存是空间换时间的一种做法,可以有效的提升响应时间,asp.net core引入了本地内存缓存和分布式缓存。
先看一下本地内存缓存:
using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.Internal; var builder = WebApplication.CreateBuilder(args); //注入内存缓存服役,设定缓存容量为40 builder.Services.AddMemoryCache(opt => { opt.SizeLimit = 40; }); var app = builder.Build(); //查询缓存 app.MapGet("/get/{id}", (IMemoryCache memoryCache, string id) => { var result = memoryCache.TryGetValue(id, out string timeStr); if (result) { return $"获取成功:{timeStr}"; } return "获取失败"; }); //配置缓存,大小为10 app.MapGet("/set/{id}", (IMemoryCache memoryCache, string id) => { var time = memoryCache.Set<string>(id, $"{id}、 {DateTime.Now}", new MemoryCacheEntryOptions { Size = 10 }); return $"设置的时间为:{time}"; }); app.Run();
SizeLimit=40为总缓存容量,Size=10为这次缓存占有容量,如果每次都是10的话,那就是最多可以生成4个,这里有个问题,也可能是个bug,当添加第5个的时候,第5个不会成功,但会把第1个删除(这里是删除最久没有被访问的),这时,只有3个有效的缓存,再次添加第5个才能生效。
在设置缓存时,可以设置SlidingExpiration和AbsoluteExpirationRelativeToNow,它们的用法见如下用法:
var time = memoryCache.Set<string>(id, $"{id}、 {DateTime.Now}", new MemoryCacheEntryOptions { //3秒内不访问过期 SlidingExpiration = TimeSpan.FromSeconds(3), //间隔少于3秒内一直有访问,则30秒过期 AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(30), });
当多副本部署时,基于内存缓存就不合适了,现在主流的一般是用redis这样的nosql数据库来快速缓存数据,本例就以redis为例,我是在本地docker中安装的redis,用命令: docker run --name some-redis -d -p 6379:6379 redis启动,appsettings.json中的配置如下:
"ConnectionStrings": { "MyRedisConStr": "127.0.0.1:6379" }
具体实现代码也很简单:
using Microsoft.Extensions.Caching.Distributed; using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.Internal; var builder = WebApplication.CreateBuilder(args); builder.Services.AddStackExchangeRedisCache(options => { options.Configuration = builder.Configuration.GetConnectionString("MyRedisConStr"); options.InstanceName = "DistributedRedis_"; }); var app = builder.Build(); app.MapGet("/disget/{id}", async (IDistributedCache distributedCache, string id) => { var result = await distributedCache.GetStringAsync(id); return $"获取成功:{result}"; }); app.MapGet("/disset/{id}", async (IDistributedCache distributedCache, string id) => { var time = $"{id}、 {DateTime.Now}"; await distributedCache.SetStringAsync(id, time, new DistributedCacheEntryOptions { SlidingExpiration = TimeSpan.FromSeconds(5), AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(30) }); return $"设置的时间为:{time}"; }); app.Run();
缓存的用法很简单,这里要注意的是什么数据更适合缓存,缓存多长时间,如果缓存失效,穿透会给系统带来什么样的压力等这样周边的问题需要处理好。
想要更快更方便的了解相关知识,可以关注微信公众号
标签:MiniAPI,builder,缓存,app,time,var,NET6,id From: https://www.cnblogs.com/ljknlb/p/16930520.html