手把手教你AspNetCore WebApi:快取(MemoryCache和Redis)
- 2020 年 10 月 14 日
- 筆記
- Asp.Net Core, Redis, Web Api, 快取
前言
這幾天小明又有煩惱了,系統上線一段時間後,系統性能出現了問題,馬老闆很生氣,叫小明一定要解決這個問題。性能問題一般用什麼來解決呢?小明第一時間想到了快取。
什麼是快取
快取是實際工作中非常常用的一種提高性能的方法。
快取可以減少生成內容所需的工作,從而顯著提高應用程式的性能和可伸縮性。 快取最適用於不經常更改的數據。 通過快取,可以比從原始數據源返回的數據的副本速度快得多。
使用記憶體快取(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 安裝
這裡我們不具體展開,你可以參考//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);
}
}
小結
目前為止,小明對分散式快取的使用也學會了,是不是非常簡單呀。不過小明還要發愁,到底實際應用中應該哪些方法可以需要用到快取,哈哈,在這裡我們不進行介紹,先讓小明去抓頭皮了。