首页 > 其他分享 >.NET6之MiniAPI(十七):缓存

.NET6之MiniAPI(十七):缓存

时间:2022-11-27 20:22:24浏览次数:37  
标签:MiniAPI builder 缓存 app time var NET6 id

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

相关文章

  • .NET6之MiniAPI(十六):数据保护
    对于web,安全是一个永久的话题,所以ASP.NETCore数据保护提供了一个简单,易用的加密API,可以用来保护数据,密钥管理和轮换。ASP.NETCore的数据保护是根据本机的一个ke......
  • .NET6之MiniAPI(十六):数据保护
    对于web,安全是一个永久的话题,所以ASP.NETCore数据保护提供了一个简单,易用的加密API,可以用来保护数据,密钥管理和轮换。ASP.NETCore的数据保护是根据本机的一个ke......
  • 利用互斥锁解决缓存击穿问题
    核心思路:相较于原来从缓存中查询不到数据后直接查询数据库而言,现在的方案是进行查询之后,如果从缓存没有查询到数据,则进行互斥锁的获取,获取互斥锁后,判断是否获得到了锁,如果......
  • 缓存雪崩和击穿问题及解决思路
    缓存雪崩是指在同一时段大量的缓存key同时失效或者Redis服务宕机,导致大量请求到达数据库,带来巨大压力。解决方案:给不同的Key的TTL添加随机值        ......
  • 缓存穿透问题的解决思路
    缓存穿透:缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库。常见的解决方案有两种:缓存空对象优点:实现简单,维......
  • 缓存更新策略
    缓存更新是redis为了节约内存而设计出来的一个东西,主要是因为内存数据宝贵,当我们向redis插入太多数据,此时就可能会导致缓存中的数据过多,所以redis会对部分数据进行更新,或者......
  • 为商户添加redis缓存
    缓存模型和思路标准的操作方式就是查询数据库之前先查询缓存,如果缓存数据存在,则直接从缓存中返回,如果缓存数据不存在,再查询数据库,然后将数据存入redis。  代码如下:......
  • 什么是缓存
    1.浏览器层缓存缓存一些静态页面等2.应用缓存将部分数据存入map,来访问时直接将map里的数据返给你。3.  缓存(Cache),就是数据交换的缓冲区,俗称的缓存就是缓冲区......
  • Net6 操作时序数据库influxdb,数据插入查询/增删存储桶
    十年河东,十年河西,莫骑少年穷学无止境,精益求精官方文档:​​https://docs.influxdata.com/influxdb/v2.4/api/​​1、项目详情<ProjectSdk="Microsoft.NET.Sdk"><Property......
  • spring三级缓存
    IOC容器中的bean是单例的bean生命周期 什么是循环依赖    什么是成品对象和半成品对象   解决循环依赖方式  spring中使用三个map来表示三级缓......