前言

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

什么是缓存

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

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

使用内存缓存(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)的更多相关文章

  1. 手把手教你AspNetCore WebApi:增删改查

    前言 小明已经创建与运行了WebApi项目,了解项目结构有哪些组成,并学会了怎么发布到IIS.基础已经建好,从现在开始要真正实现待办事项的功能了. 新建表 CREATE TABLE [dbo].[To ...

  2. 手把手教你AspNetCore WebApi:入门

    需求 前几天,马老板给小明和小红一个"待办事项"网站,小明负责后端,小红负责前端,并要求网站可以同时在 Windows.和 Linux 上运行. 小明整理了一下"待办事项 ...

  3. 手把手教你AspNetCore WebApi:Serilog(日志)

    前言 小明目前已经把"待办事项"功能实现了,API文档也搞定了,但是马老板说过,绝对不能让没有任何监控的项目上线的. Serilog是什么? 在.NET使用日志框架第一时间会想到N ...

  4. 手把手教你AspNetCore WebApi:认证与授权

    前言 这几天小明又有烦恼了,之前给小红的接口没有做认证授权,直接裸奔在线上,被马老板发现后狠狠的骂了一顿,赶紧让小明把授权加上.赶紧Baidu一下,发现大家都在用JWT认证授权,这个倒是挺适合自己的. ...

  5. 手把手教你AspNetCore WebApi:Nginx(负载均衡)

    前言 这几天小明又有烦恼了,系统上线一段时间后,系统性能出现了问题,缓存等都用上了,还是不能解决问题.马老板很大气,又买了3台服务器,让小明做个集群分流一下. 集群是什么? 是一种计算机系统,它通过一 ...

  6. 手把手教你AspNetCore WebApi:Swagger(Api文档)

    前言 小明已经实现"待办事项"的增删改查,并美滋滋向负责前端的小红介绍Api接口,小红很忙,暂时没有时间听小明介绍,希望小明能给个Api文档.对于码农小明来说能不写文档就尽量不要写 ...

  7. 手把手教你AspNetCore WebApi:数据验证

    前言 小明最近又遇到麻烦了,小红希望对接接口传送的数据进行验证,既然是小红要求,那小明说什么都得满足呀,这还不简单嘛. 传统验证 [HttpPost] public async Task<Act ...

  8. Asp.net Core2.0 缓存 MemoryCache 和 Redis

    自从使用Asp.net Core2.0 以来,不停摸索,查阅资料,这方面的资料是真的少,因此,在前人的基础上,摸索出了Asp.net Core2.0 缓存 MemoryCache 和 Redis的用法 ...

  9. Asp.net Core 缓存 MemoryCache 和 Redis

    Asp.net Core 缓存 MemoryCache 和 Redis 目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 经过 N 久反复的尝试,翻阅了网上无数的资料,GitH ...

随机推荐

  1. [oracle/sql]关于清除重复,not in方案和not exists方案的对比

    有这样一张表: CREATE TABLE tb_sc ( id NUMBER not null primary key, studentid int not null, courseid int no ...

  2. about blog

    前言 今天无意中发现了一个小姐姐自己设计的的博客,感觉非常的nice,就随手copy一下,完了感觉效果还蛮好的 end 附上小姐姐的博客以及教程

  3. Lambda表达式看这篇基本就够用了

    本文讯] 2020.05.08  polo  写博不易,尊重知识! Lambda  是java8 引入的一个新特性,闭包,又叫函数式接口,下面介绍下,常用的lambda表达式方式: 所谓的将函数作为一 ...

  4. Java-Collection和Map

    创建博客的目的主要帮助自己记忆和复习日常学到和用到的知识:或有纰漏请大家斧正,非常感谢! 之前面试,被问过一个问题:List和Set的区别. 主要区别很明显了,两者都是数组形式存在的,继承了Colle ...

  5. Java I/O流 复制文件速度对比

    Java I/O流 复制文件速度对比 首先来说明如何使用Java的IO流实现文件的复制: 第一步肯定是要获取文件 这里使用字节流,一会我们会对视频进行复制(视频为非文本文件,故使用之) FileInp ...

  6. openstack 介绍

    penstack介绍(1)   一.云计算的前世今生 所有的新事物都不是突然冒出来的,都有前世和今生.云计算也是IT技术不断发展的产物. 要理解云计算,需要对IT系统架构的发展过程有所认识. 请看下 ...

  7. flutter实现可缩放可拖拽双击放大的图片功能

    flutter实现可缩放可拖拽双击放大的图片功能 可缩放可拖拽的功能,可实现图片或者其他widget的缩放已经拖拽并支持双击放大的功能 我们知道官方提供了双击缩放,但是不支持拖拽的功能,我们要实现向百 ...

  8. 写一个简单的 Linux Shell (C++)

    这里可以找到代码 github.com/z0gSh1u/expshell 支持的特性 单条指令的执行 引号引起的参数(如 $ some_program "hello, world" ...

  9. 预科班D11

    2020.09.21星期一 预科班D11 学习内容: 一.基本数据类型及内置方法 1.整形int及浮点型float + - * / // ** % > < >= <= 2.字符 ...

  10. jfinal3连接sqlserver2012 使用generator生成model 拉取所有的表

    修改MetaBuilder中的getTablesResultSet方法,在schemaPattern的下面一行增加 schemaPattern=dialect instanceof SqlServer ...