首页 > 数据库 >手把手教你AspNetCore WebApi:缓存(MemoryCache和Redis)

手把手教你AspNetCore WebApi:缓存(MemoryCache和Redis)

时间:2023-06-05 22:07:30浏览次数:49  
标签:WebApi 缓存 MemoryCache Get AspNetCore cache Redis now public

前言

这几天小明又有烦恼了,系统上线一段时间后,系统性能出现了问题,马老板很生气,叫小明一定要解决这个问题。性能问题一般用什么来解决呢?小明第一时间想到了缓存。

什么是缓存

缓存是实际工作中非常常用的一种提高性能的方法。

缓存可以减少生成内容所需的工作,从而显著提高应用程序的性能和可伸缩性。 缓存最适用于不经常更改的数据。 通过缓存,可以比从原始数据源返回的数据的副本速度快得多。

使用内存缓存(MemoryCache)

首先,我们简单的创建一个控制器,实现一个简单方法,返回当前时间。我们可以看到每次访问这个接口,都可以看到当前时间。

[Route("api/[controller]")]
[ApiController]
public class CacheController : ControllerBase
{
    [HttpGet]
    public string Get()
    {
        return DateTime.Now.ToString();
    }
}

接下来,安装Microsoft.Extensions.Caching.Memory包

  • 右键单击“解决方案资源管理器” > “管理 NuGet 包”中的项目
  • 将“包源”设置为“nuget.org”
  • 确保启用“包括预发行版”选项
  • 在搜索框中输入“Microsoft.Extensions.Caching.Memory”
  • 从“浏览”选项卡中选择最新的“Microsoft.Extensions.Caching.Memory”包,然后单击“安装”

接下来,使用依赖关系注入从应用中引用的服务,在Startup类的ConfigureServices()方法中配置:

public void ConfigureServices(IServiceCollection services)
{
    services.AddMemoryCache();
}

接下来,在构造函数中请求IMemoryCache实例

private IMemoryCache cache;
public CacheController(IMemoryCache cache)
{
    this.cache = cache ?? throw new ArgumentNullException(nameof(cache));
}

接下来,在Get方法中使用缓存

[HttpGet]
public string Get()
{
    //读取缓存
    var now = cache.Get<string>("cacheNow");
    if (now == null) //如果没有该缓存
    {
        now = DateTime.Now.ToString();
        cache.Set("cacheNow", now);
        return now;
    }
    else
    {
        return now;
    }
}

经过测试可以看到,缓存后,我们取到日期就从内存中获得,而不需要每次都去计算,说明缓存起作用了。目前为止,我们对缓存的使用已经基本上没有问题了,是不是so easy呀,当然还有一些如何让缓存过期,缓存大小限制,以及删除缓存,这个就更简单,看看这个MemoryCacheOptions就知道,我们在这里就不展开了。接下来我们来讲分布式缓存。

使用分布式缓存(Redis)

Redis是什么?

Redis是一个高性能的 key-value 数据库。Redis性能极高,能读的速度是110000次/s,写的速度是81000次/s。

Redis 安装

这里我们不具体展开,你可以参考https://www.runoob.com/redis/redis-install.html按步骤进行安装。

使用 Redis 分布式缓存

首先,安装Microsoft.Extensions.Caching.Redis包

  • 右键单击“解决方案资源管理器” > “管理 NuGet 包”中的项目
  • 将“包源”设置为“nuget.org”
  • 确保启用“包括预发行版”选项
  • 在搜索框中输入“Microsoft.Extensions.Caching.Redis”
  • 从“浏览”选项卡中选择最新的“Microsoft.Extensions.Caching.Redis”包,然后单击“安装”

接下来,使用依赖关系注入从应用中引用的服务,在Startup类的ConfigureServices()方法中配置:

public void ConfigureServices(IServiceCollection services)
{
    // install-package Microsoft.Extensions.Caching.Redis
    services.AddDistributedRedisCache(options =>
    {
        options.InstanceName = "";
        options.Configuration = "127.0.0.1:6379";
    });
}

接下来,在构造函数中请求IDistributedCache实例

private IDistributedCache cache;
public RedisCacheController(IDistributedCache cache)
{
    this.cache = cache ?? throw new ArgumentNullException(nameof(cache));
}

接下来,在Get方法中使用缓存

[HttpGet]
public string Get()
{
    //读取缓存
    var now = cache.Get("cacheNow");
    if (now == null) //如果没有该缓存
    {
        cache.Set("cacheNow", Encoding.UTF8.GetBytes(DateTime.Now.ToString()));
        now = cache.Get("cacheNow");
        return Encoding.UTF8.GetString(now);
    }
    else
    {
        return Encoding.UTF8.GetString(now);
    }
}

小结

目前为止,小明对分布式缓存的使用也学会了,是不是非常简单呀。不过小明还要发愁,到底实际应用中应该哪些方法可以需要用到缓存,哈哈,在这里我们不进行介绍,先让小明去抓头皮了。



标签:WebApi,缓存,MemoryCache,Get,AspNetCore,cache,Redis,now,public
From: https://blog.51cto.com/u_4018548/6419726

相关文章

  • 手把手教你AspNetCore WebApi:增删改查
    前言小明已经创建与运行了WebApi项目,了解项目结构有哪些组成,并学会了怎么发布到IIS。基础已经建好,从现在开始要真正实现待办事项的功能了。新建表CREATETABLE[dbo].[Todo]( [Id][uniqueidentifier]NOTNULL, [Name][nvarchar](100)NULL,CONSTRAINT[PK_Todo]PRIMARYKEY......
  • 手把手教你AspNetCore WebApi:认证与授权
    前言这几天小明又有烦恼了,之前给小红的接口没有做认证授权,直接裸奔在线上,被马老板发现后狠狠的骂了一顿,赶紧让小明把授权加上。赶紧Baidu一下,发现大家都在用JWT认证授权,这个倒是挺适合自己的。什么是TokenToken是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后......
  • Python|通过FastAPI开发一个快速的WebAPI项目
    前言Python如此受欢迎的众多原因之一是Python有大量成熟和稳定的库可供选择:网页开发有:Django和Flask,提供了很好的网络开发体验和大量的有用文档机器学习有:scikit-learn、Keras等,提供了丰富的机器学习的包和数据处理和可视化工具。FastAPI是一个快速、轻量级的现代A......
  • .net 温故知新【11】:Asp.Net Core WebAPI 入门使用及介绍
    在Asp.NetCore上面由于现在前后端分离已经是趋势,所以asp.netcoreMVC用的没有那么多,主要以WebApi作为学习目标。一、创建一个WebApi项目我使用的是VS2022,.Net7版本。在创建界面有几项配置:配置Https启用Docker使用控制器启用OpenAPI支持不使用顶级语句其中配置Ht......
  • .NET Core WebAPI 认证授权之JWT
    @@.NETCoreWebAPI认证授权之JWT--google from --->NETCoreWebAPI认证授权之JWT(二)  在上一篇 《.NET缓存系列(一):缓存入门》中实现了基本的缓存,接下来需要对缓存进行改进,解决一些存在的问题。一、缓存过期策略问 题:当源数据更改或删除时,服务器程序并不知道,导......
  • NET Core WebAPI 认证授权之JWT
    @@.netcoretoken非对称加密 --Google-->@@wepapi认证授权之jwt NETCoreWebAPI认证授权之JWT(二):HMAC算法实操  一、前言在上一篇 《.NETCoreWebAPI认证授权之JWT(一):JWT介绍》中讲到了JWT的组成,分为三部分,其中标头(header)和载荷(payload)都只是简单的将json......
  • aspnetcore最最简单的接口权限认证
    五月一眨眼就过去,就当凑个数吧。场景:一个小小的项目,需要一个后台,就展示几个列表,连用户表、角色表等都不需要设计。之前有写过identityserver4和jwt4的demo(exercisebook/IdentityServer4&Serilogatmain·liuzhixin405/exercisebook·GitHubexercisebook/授权/授权一/Jw......
  • C# WebApi接收参数的常用方式
    C#后端开发请求相关知识C#WebApi接收参数的常用方式查询字符串参数:查询字符串是通过HTTPGET请求中的URL中传递的键值对。在WebAPI中,可以使用以下方式获取查询字符串参数://使用Request.QueryString获取单个查询字符串参数stringname=Request.QueryString["name......
  • ASP.NET MVC WebAPI Put和Delete请求出现405(Method not allowed)错误
    解决办法:在站点根目录下的web.config设置如下(主要参考添加项):<system.webServer></system.webServer>(End)转自:https://www.bbsmax.com/A/qVdepEM85P/......
  • ASP.NET Core Swagger接入使用IdentityServer4 的 WebApi
    写在前面是这样的,我们现在接口使用了Ocelot做网关,Ocelot里面集成了基于IdentityServer4的开发的授权中心用于对Api资源的保护。问题来了,我们的Api用了SwaggerUI做接口的自文档,那就蛋疼了,你接入了IdentityServer4的Api,用SwaggerUI调试、调用接口的话,妥妥的401,未授权啊。那有小伙伴就......