zoukankan      html  css  js  c++  java
  • 手把手教你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);
        }
    }
    

    小结

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

  • 相关阅读:
    hdoj 3376,2686 Matrix Again 【最小费用最大流】
    Trustie站点代码托管使用指南
    POJ 2442 Sequence(堆的使用练习)
    猛犸机器学习开发实践
    关于《金字塔原理》的主要内容
    实战案例:如何快速打造1000万+播放量的抖音网红?
    【限时特惠】网易云易盾验证码全线95折!智能无感知、滑动拼图、点选验证-7天免费体验!
    当GDPR来敲门,中国互联网企业该如何应对?
    H5活动产品设计指南基础版
    Box(视图组件)如何在多个页面不同视觉规范下的复用
  • 原文地址:https://www.cnblogs.com/bruce1992/p/14050232.html
Copyright © 2011-2022 走看看