.NET6之MiniAPI(十七):缓存

Posted dotNET跨平台

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了.NET6之MiniAPI(十七):缓存相关的知识,希望对你有一定的参考价值。

缓存是空间换时间的一种做法,可以有效的提升响应时间,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();

缓存的用法很简单,这里要注意的是什么数据更适合缓存,缓存多长时间,如果缓存失效,穿透会给系统带来什么样的压力等这样周边的问题需要处理好。

以上是关于.NET6之MiniAPI(十七):缓存的主要内容,如果未能解决你的问题,请参考以下文章

.NET6之MiniAPI:日志

.NET6之MiniAPI(二十九):UnitTest

.NET6之MiniAPI:引入EntityFramewor

.NET6之MiniAPI:开始Mini API

.NET6之MiniAPI:Response

.NET6之MiniAPI(十九):NLog