c#使用客户端、服务端、内存缓存

本文介绍了在ASP.NETCoreWebAPI中使用三种缓存策略:客户端缓存利用[ResponseCache]特性控制数据有效期,服务端缓存通过app.UseResponseCaching()启用,以及内存缓存通过AddMemoryCache注册并使用IMemoryCache接口进行数据存储。示例代码展示了如何实现和配置这些缓存机制。

c#使用客户端、服务端、内存缓存

这里演示的框架为asp.net core webapi

客户端缓存

有一种属性可以设置数据的有效时间
比如我通过方法从数据库中拿到一笔数据 我可以通过 [ResponseCache(Duration =30)]去设置数据的时间,单位为秒,意思是我在30秒内拿到的数据还是一样的,30之后的在请求数据就要重新向数据库
请求一次新的数据

using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;

namespace WebApplication1.Controllers
{
    [Route("[controller]/[action]")]
    [ApiController]
    public class ValuesController : ControllerBase
    {
        [ResponseCache(Duration =5)]//代表数据5秒失效
        [HttpGet]
        public DateTime qwe() 
        {
            return DateTime.Now;
        }
    }
}

请添加图片描述
请添加图片描述
可以看到五秒之前和五秒之后拿到的数据是不一样的

服务端缓存

服务器响应缓存就是在服务器中开出一块空间,客户端向服务器端发送请求的时候会先经过那块空间看有没有我请求的数据,如果没有就会执行方法返回数据给你,如果有就把缓存的数据给你,
如果你客户端设置了缓存 比如上面说的[ResponseCache(Duration =30)] 那服务端就会识别你这个是需要缓存的,他就会把数据执行一遍放到缓存里面
并且他只能缓存200的gat和head的才能缓存并且报文头里面不能有Authorization和 set-cookie等
而且如何你先缓存的是一个非常消耗性能的方法,能缓存的话当然可以,如果一千或者一万人都需要访问这个方法,但是他们的客户端浏览器都勾选了禁用缓存那怎么办,这时候需要用到内存缓存或者分布式缓存 所以服务端缓存有点鸡肋

使用
在Program类中设置 app.UseResponseCaching(); 不过必须要保证设置在 app.MapControllers();前
如果有 app.UseCors();//表示启用中间件 要保证在他之后

namespace WebApplication1
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var builder = WebApplication.CreateBuilder(args);

            // Add services to the container.

            builder.Services.AddControllers();
            // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
            builder.Services.AddEndpointsApiExplorer();
            builder.Services.AddSwaggerGen();

            var app = builder.Build();

            // Configure the HTTP request pipeline.
            if (app.Environment.IsDevelopment())
            {
                app.UseSwagger();
                app.UseSwaggerUI();
            }

            app.UseHttpsRedirection();

            app.UseAuthorization();

            app.UseResponseCaching();//启用服务器响应缓存

            app.MapControllers();

            app.Run();
        }
    }
}

请添加图片描述
我开了两个浏览器发送请求的结果都是一样的,因为已经命中了服务器端的响应缓存

内存缓存

先注入AddMemoryCache的服务

namespace 内存缓存
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var builder = WebApplication.CreateBuilder(args);

            // Add services to the container.

            builder.Services.AddControllers();
            // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
            builder.Services.AddEndpointsApiExplorer();
            builder.Services.AddSwaggerGen();
            builder.Services.AddMemoryCache();//注册内存缓存服务


            var app = builder.Build();

            // Configure the HTTP request pipeline.
            if (app.Environment.IsDevelopment())
            {
                app.UseSwagger();
                app.UseSwaggerUI();
            }

            app.UseHttpsRedirection();

            app.UseAuthorization();


            app.MapControllers();

            app.Run();
        }
    }
}

在控制器中引用依赖

using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Caching.Memory;

namespace 内存缓存.Controllers
{
    [Route("[controller]/[action]")]
    [ApiController]
    public class ValuesController : ControllerBase
    {
        private readonly IMemoryCache MemoryCache;

        public ValuesController(IMemoryCache MemoryCache)
        {
            this.MemoryCache = MemoryCache;
        }

        [HttpGet]
        public async Task<ActionResult<book?>> qqq(int id)
        {
            string cachekey = "book" + id;//模拟id
           book? b = MemoryCache.Get<book?>(cachekey);//去缓存里面查询相同id的数据
            if (b == null)
            {
            //如果没有查到就把数据添加到缓存里面
                b = await Dbcontext.eee(id);

                MemoryCache.Set(cachekey, b);
            }
      
        }
    }
    public class Dbcontext
    {
        public static Task<book?> eee(int id)
        {
            var q = qq(id);
            return Task.FromResult(q);
        }
        public static book? qq(int id)
        {
            switch (id) 
            {
                case 1:
                    return new book(1,"1");
                case 2:
                    return new book(2, "2");
                case 3:
                    return new book(3, "3");
                default: return null;
            }
        }
    }
    public record book(int id,string result);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值