手把手教你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);
    }
}

小結

目前為止,小明對分布式緩存的使用也學會了,是不是非常簡單呀。不過小明還要發愁,到底實際應用中應該哪些方法可以需要用到緩存,哈哈,在這里我們不進行介紹,先讓小明去抓頭皮了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM