手把手教你AspNetCore WebApi:缓存(MemoryCache和Redis)
前言
这几天小明又有烦恼了,系统上线一段时间后,系统性能出现了问题,马老板很生气,叫小明一定要解决这个问题。性能问题一般用什么来解决呢?小明第一时间想到了缓存。
什么是缓存
缓存是实际工作中非常常用的一种提高性能的方法。
缓存可以减少生成内容所需的工作,从而显著提高应用程序的性能和可伸缩性。 缓存最适用于不经常更改的数据。 通过缓存,可以比从原始数据源返回的数据的副本速度快得多。
使用内存缓存(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);
}
}
小结
目前为止,小明对分布式缓存的使用也学会了,是不是非常简单呀。不过小明还要发愁,到底实际应用中应该哪些方法可以需要用到缓存,哈哈,在这里我们不进行介绍,先让小明去抓头皮了。
手把手教你AspNetCore WebApi:缓存(MemoryCache和Redis)的更多相关文章
- 手把手教你AspNetCore WebApi:增删改查
前言 小明已经创建与运行了WebApi项目,了解项目结构有哪些组成,并学会了怎么发布到IIS.基础已经建好,从现在开始要真正实现待办事项的功能了. 新建表 CREATE TABLE [dbo].[To ...
- 手把手教你AspNetCore WebApi:入门
需求 前几天,马老板给小明和小红一个"待办事项"网站,小明负责后端,小红负责前端,并要求网站可以同时在 Windows.和 Linux 上运行. 小明整理了一下"待办事项 ...
- 手把手教你AspNetCore WebApi:Serilog(日志)
前言 小明目前已经把"待办事项"功能实现了,API文档也搞定了,但是马老板说过,绝对不能让没有任何监控的项目上线的. Serilog是什么? 在.NET使用日志框架第一时间会想到N ...
- 手把手教你AspNetCore WebApi:认证与授权
前言 这几天小明又有烦恼了,之前给小红的接口没有做认证授权,直接裸奔在线上,被马老板发现后狠狠的骂了一顿,赶紧让小明把授权加上.赶紧Baidu一下,发现大家都在用JWT认证授权,这个倒是挺适合自己的. ...
- 手把手教你AspNetCore WebApi:Nginx(负载均衡)
前言 这几天小明又有烦恼了,系统上线一段时间后,系统性能出现了问题,缓存等都用上了,还是不能解决问题.马老板很大气,又买了3台服务器,让小明做个集群分流一下. 集群是什么? 是一种计算机系统,它通过一 ...
- 手把手教你AspNetCore WebApi:Swagger(Api文档)
前言 小明已经实现"待办事项"的增删改查,并美滋滋向负责前端的小红介绍Api接口,小红很忙,暂时没有时间听小明介绍,希望小明能给个Api文档.对于码农小明来说能不写文档就尽量不要写 ...
- 手把手教你AspNetCore WebApi:数据验证
前言 小明最近又遇到麻烦了,小红希望对接接口传送的数据进行验证,既然是小红要求,那小明说什么都得满足呀,这还不简单嘛. 传统验证 [HttpPost] public async Task<Act ...
- Asp.net Core2.0 缓存 MemoryCache 和 Redis
自从使用Asp.net Core2.0 以来,不停摸索,查阅资料,这方面的资料是真的少,因此,在前人的基础上,摸索出了Asp.net Core2.0 缓存 MemoryCache 和 Redis的用法 ...
- Asp.net Core 缓存 MemoryCache 和 Redis
Asp.net Core 缓存 MemoryCache 和 Redis 目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 经过 N 久反复的尝试,翻阅了网上无数的资料,GitH ...
随机推荐
- HTTPS建立过程
由于HTTPS建立过程经常忘记,固记录 HTTPS建立流程 客户端发起SSL连接 服务端发送证书(证书中包含了服务端公钥) 客户端根据已有证书判断是否是可信任的(客户端决定是否继续) 服务端要求客户端 ...
- C#操作Excel开发报表系列整理
C#操作Excel进行报表开发系列共写了八篇,也已经有很久没有新东西了,现在整理一下,方便以后查阅,如果有写新的,会同时更新.需要注意的是因为Office的版本不同,实际的代码可能会有所不同,但是都是 ...
- 解决Maven下载速度缓慢问题
解决Maven下载速度缓慢问题 第一步:找到自己安装maven的路径,选择setting.xml D:\apache-maven-3.2.2\conf\settings.xml 第二步:打开setti ...
- leetcode刷题-37解数独
题目 编写一个程序,通过已填充的空格来解决数独问题. 一个数独的解法需遵循如下规则: 数字 1-9 在每一行只能出现一次.数字 1-9 在每一列只能出现一次.数字 1-9 在每一个以粗实线分隔的 3x ...
- 如何《快速搭建LAMP环境》
阿里云体验平台简介 阿里云开发者实验室提供免费云资源和丰富的场景化实践,旨在帮助开发者在学习应用技术,了解阿里云产品的特性. 教程介绍 本教程引用自阿里云体验实验室介绍如何快速搭建Docker环境,并 ...
- java 二维码生成(可带图片)springboot版
本文(2019年6月29日 飞快的蜗牛博客) 有时候,男人和女人是两个完全不同的世界,男人的玩笑和女人的玩笑也完全是两码事,爱的人完全不了解你,你也不要指望一个女人了解你,所以男的不是要求别人怎么样, ...
- ES 实现实时从Mysql数据库中读取热词,停用词
IK分词器虽然自带词库 但是在实际开发应用中对于词库的灵活度的要求是远远不够的,IK分词器虽然配置文件中能添加扩展词库,但是需要重启ES 这章就当写一篇扩展了 其实IK本身是支持热更新词库的,但是需要 ...
- oracle之二数据库审计
数据库审计audit(PPT-I-320-334) 13.1 审计的功能:监控特定用户在database 的action(操作) 13.2 审计种类: 1)标准数据库审计(语句审计.权限审计.对象审计 ...
- Linux rndis_host 驱动的一个BUG与解决方案
关键字 rndis_host, linux, kernel, modem 综述 rndis 是微软定义的一套通讯方案.类似的协议还有 qmi/mbim/ecm/ncm. rndis 协议足够简单,可靠 ...
- 关于JAVA的一些零碎小知识
1.经常遇到集合之间需要互相转化的 Array和List转化:Arrays.asList(数组):list.toArray(); List和Set转化:Set<String> set = ...