iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 23
0
Modern Web

我與 ASP.NET Core 的 30天系列 第 23

[Day23] 本機快取與Redis快取 - 我與 ASP.NET Core 3 的 30天

快取基本概念

快取可以藉由減少產生內容所需的工作,大幅改善應用程式的效能和擴充性。快取最適合用於不常變動產生成本較高的資料。快取會建立資料的複本,而這些資料的傳回速度會比來源快許多。應用程式應該撰寫和測試,永遠不依賴快取的資料。
ASP.NET Core 支援數個不同的快取。 最簡單的快取是以 IMemoryCache為基礎。 IMemoryCache 表示儲存在 web 伺服器記憶體中的快取。

在ASP.NET Core使用本機快取

在ASP.NET Core當中,可以透過DI的方式取得IMemoryCache
以下範例透過使用IMemoryCache來實踐本機快取的機制:
首先在Starup.ConfigureServices註冊MemoryCache的服務

services.AddMemoryCache();

建立一個MemoryCacheController,並加入Action

Route("api/[controller]")]
[ApiController]
public class MemoryCacheController : ControllerBase
{
    private IMemoryCache _cache { get; set; }
    public MemoryCacheController(IMemoryCache memoryCache)
    {
        _cache = memoryCache;
    }

    [HttpGet("")]
    public ActionResult<Dictionary<string, string>> Get()
    {
        DateTime cacheEntry;

        // 嘗試取得指定的Cache
        if (!_cache.TryGetValue("CachKey", out cacheEntry))
        {
            // 指定的Cache不存在,所以給予一個新的值
            cacheEntry = DateTime.Now;

            // 設定Cache選項
            var cacheEntryOptions = new MemoryCacheEntryOptions()
                // 設定Cache保存時間,如果有存取到就會刷新保存時間
                .SetSlidingExpiration(TimeSpan.FromSeconds(60));

            // 把資料除存進Cache中
            _cache.Set("CachKey", cacheEntry, cacheEntryOptions);
        }
        
        return new Dictionary<string, string>()
        {
            {"現在時間", DateTime.Now.ToString()},
            {"快取內容", cacheEntry.ToString()}
        };
    }
}

https://ithelp.ithome.com.tw/upload/images/20201007/20129389Zji0ugFWIM.png
https://ithelp.ithome.com.tw/upload/images/20201007/2012938911sZ3EEu7q.png
上面範例可看到,快取是由Key/Value所組成的,Value可以塞入任意型別的資料(包括類別),透過善用快取,可以有效的提升網站的效能,節省部分存取的資源。

分散式快取

當網站有多個站台,且這些站都需要共用同一份快取資料的時候,就需要使用分散式快取,分散式快取是由多個應用程式伺服器所共用的快取,通常會以外部服務的形式維護給存取它的應用程式伺服器。分散式快取可以改善 ASP.NET Core 應用程式的效能和擴充性。
分散式快取有以下優點:

  • 可以供多台伺服器共用同一份資料
  • 在應用程式重新部署,或是伺服器重啟時,暫存的資料不會流失
  • 不使用本機記憶體

在ASP.NET Core中會透過實作IDistributedCache介面來對分散式快取進行操作,提供實作IDistributedCache的分散式架構有包括

  • 分散式記憶體快取
  • 分散式 SQL Server 快取
  • 分散式 Redis 快取
  • 分散式 NCache 快取

Redis快取

Redis 是一種開放原始碼的記憶體內部資料存放區,通常用來做為分散式快取。
在使用ASP.NET Core存取Redis前,必須得先進行安裝,可以從官網下載並安裝
以下介紹如何在ASP.NET Core中使用Redis快取
首先透過.NET CLI的指令在專案下安裝nuget套件

dotnet add package Microsoft.Extensions.Caching.Redis

接著在Startup.ConfigureServices加入

services.AddDistributedRedisCache(options =>
            {
                options.Configuration = ""; //這邊輸入Redis Server的IP:Port
            });

接著將IDistributedCache注入到要使用的類別中就能夠使用了
IDistributedCache提供了以下方法來操作分散式快取:

  • Get、GetAsync:接受字串索引鍵,並以陣列形式抓取快取的項目( byte[] 如果在快取中找到的話)。
  • Set、SetAsync:使用字串索引鍵,將 (為 byte[] 陣列) 的項目加入至快取。
  • Refresh、RefreshAsync:根據快取的索引鍵重新整理快取,重設到期時間。
  • Remove、RemoveAsync:會根據其字串索引鍵來移除快取專案。

IDistributedCache的 GET/SET 不像是IMemoryCache可以存取任意型別,只能存取byte[]型別,所以如果要將資料存入Redis(或是其他分散式快取),就必須把型別轉為byte[]

參考資料
Distributed caching in ASP.NET Core


上一篇
[Day22] 身份驗證與授權 - 我與 ASP.NET Core 3 的 30天
下一篇
[Day24] Response快取 - 我與 ASP.NET Core 3 的 30天
系列文
我與 ASP.NET Core 的 30天31

尚未有邦友留言

立即登入留言