ASP.NET Core MVC 從入門到精通之緩存

隨着技術的發展,ASP.NET Core MVC也推出了好長時間,經過不斷的版本更新迭代,已經越來越完善,本系列文章主要講解ASP.NET Core MVC開發B/S系統過程中所涉及到的相關內容,適用於初學者,在校畢業生,或其他想從事ASP.NET Core MVC 系統開發的人員。

經過前幾篇文章的講解,初步瞭解ASP.NET Core MVC項目創建,啓動運行,以及命名約定,創建控制器,視圖,模型,接收參數,傳遞數據ViewData,ViewBag,路由,頁面佈局,wwwroot和客戶端庫,Razor語法,EnityFrameworkCore與數據庫,HttpContext,Request,Response,Session,序列化,文件上傳,自動映射,Html輔助標籤,模型校驗,鑑權、授權基礎,Identity入門,日誌管理,Filter(篩選器)等內容,今天繼續講解ASP.NET Core MVC 中緩存等相關內容,僅供學習分享使用。

 

緩存的優點

在應用程序中,使用緩存,具有如下優點:

  1. 提高應用程序的訪問速度
  2. 適用於不易改變的數據

緩存分類

根據緩存的應用範圍和存儲方式,可以分爲以下幾種:

  1. 內存緩存:這種方式是將內容緩存到Web服務器內存在,主要適用於單服務器程序,且在服務器重啓後,緩存中的數據也會丟失。
  2. 緩存服務器:對於分佈式部署的Web系統,緩存與內存中的方式會造成各個Web服務器中的緩存內容不一致,一般都會有獨立的緩存服務器,如Redis,SQL Server等存儲緩存的地方。緩存服務器中的內容,不會隨着Web服務器的重啓而變化。
  3. 客戶端:緩存於客戶端一般通過Header實現,也可以通過localStorage,Cookie等方式。

 

內存緩存

In-Memory緩存,將數據緩存在Web服務器內存中,適用於單服務器部署的程序。在ASP.NET Core MVC程序中,使用內存緩存的步驟如下

1. 添加緩存服務

在Program.cs啓動程序中,增加非分佈式內存緩存服務,如下所示:

1 //內存緩存
2 builder.Services.AddMemoryCache();

2. 注入緩存接口

在需要用到的內存緩存的控制器中,添加內存緩存接口IMemoryCache注入,如下所示:

1 private readonly ILogger<HomeController> _logger;
2 
3 private readonly IMemoryCache _memoryCache;//內存緩存接口
4 
5 public HomeController(ILogger<HomeController> logger,IMemoryCache memoryCache)
6 {
7     _logger = logger;
8     _memoryCache = memoryCache;
9 }

3. 獲取/設置緩存

在使用緩存的地方,獲取和設置緩存如下所示:

 1 public IActionResult Index()
 2 {
 3     
 4     if(!_memoryCache.TryGetValue("citys",out List<City> cityList))
 5     {
 6         cityList = GetCitys();
 7         var memoryCacheEntryOptions = new MemoryCacheEntryOptions();
 8         memoryCacheEntryOptions.SetAbsoluteExpiration(TimeSpan.FromSeconds(10));
 9         memoryCacheEntryOptions.RegisterPostEvictionCallback((object key, object value, EvictionReason reason, object state) =>
10         {
11             //在被清除緩存時,重新回調,重新填充
12             _logger.LogInformation("緩存被清除了.");
13         }, this);
14         _memoryCache.Set("citys", cityList, memoryCacheEntryOptions);
15     }
16     ViewBag.Citys = cityList;
17     return View();
18 }

4. 參數說明

示例中MemoryCacheEntryOptions,主要用於設置內存緩存參數,主要有以下幾個參數可以設置:

  1. AbsoluteExpiration 設置絕對過期時間
  2. SlidingExpiration 滑動過期時間
  3. PostEvictionCallbacks 緩存清除時的回調函數

分佈式緩存

分佈式緩存是由多個應用服務器共享的緩存,通常作爲訪問它的應用服務器的外部服務進行維護。 分佈式緩存可以提高 ASP.NET Core 應用的性能和可伸縮性,尤其是當應用由雲服務或服務器場託管時。

與其他將緩存數據存儲在單個應用服務器上的緩存方案相比,分佈式緩存具有多個優勢。分佈式緩存的優點

  1. 無需Sticky Session
  2. 可擴展,適用於多臺Web服務器部署的情況。
  3. 獨立存儲,Web服務器重啓不會影響緩存
  4. 性能更好

1. 分佈式緩存先決條件

爲使用的分佈式緩存提供程序添加包引用:

  • 對於 Redis 分佈式緩存, Microsoft.Extensions.Caching.StackExchangeRedis。
  • 對於 SQL Server,請參閱 Microsoft.Extensions.Caching.SqlServer。
  • 對於 NCache 分佈式緩存, NCache.Microsoft.Extensions.Caching.OpenSource。

本示例主要介紹Redis分佈式緩存。

2. 環境搭建

使用Redis進行緩存,首先需要搭建Redis環境。關於Redis環境,可參考之前的文章:

  • Redis安裝與啓動:https://www.cnblogs.com/hsiang/p/14224484.html
  • Redis基礎命令:https://www.cnblogs.com/hsiang/p/14269906.html
  • Redis配置文件:https://www.cnblogs.com/hsiang/p/14287098.html
  • Redis事務:https://www.cnblogs.com/hsiang/p/14311126.html

3. 安裝依賴包

Redis的分佈式緩存,需要安裝第三方依賴包Microsoft.Extensions.Caching.StackExchangeRedis,如下所示:

4. 添加分佈式緩存服務

添加StackExchangeRedisCache服務,通過Configruation配置Redis連接信息和InstanceName實例名稱。如下所示:

1 //分佈式緩存
2 builder.Services.AddStackExchangeRedisCache(options =>
3 {
4     options.Configuration = "192.168.1.6:6379";
5     options.InstanceName = "redis";
6 });

 

5. 注入分佈式緩存接口

在Controller中,注入分佈式緩存接口IDistributedCache,如下所示:

1 private readonly IDistributedCache _distributedCache;
2 
3 public HomeController(ILogger<HomeController> logger ,IDistributedCache distributedCache)
4 {
5     _logger = logger;
6     _distributedCache = distributedCache;
7 }

 

6. 獲取/設置緩存

在使用緩存的地方,獲取GetString和設置SetString緩存如下所示:

 1 public IActionResult Index()
 2 {
 3     var cityList = new List<City>();
 4     var obj = _distributedCache.GetString("citys");
 5     if (string.IsNullOrEmpty(obj))
 6     {
 7         cityList = GetCitys();
 8         DistributedCacheEntryOptions options = new DistributedCacheEntryOptions();
 9         options.SetAbsoluteExpiration(TimeSpan.FromSeconds(60));
10         obj = JsonConvert.SerializeObject(cityList);
11         _distributedCache.SetString("citys", obj,options);
12     }
13     cityList = JsonConvert.DeserializeObject<List<City>>(obj);
14     ViewBag.Citys = cityList;
15     return View();
16 }

7. 運行測試

運行程序,在瀏覽器中默認打開Home/Index,城市列表信息首次從數據庫獲取,再次獲取時,則會從緩存獲取。如下所示:

 在Redis服務器上進行查看,可以發現:

1. 緩存服務器中存儲的Key是加了配置的InstanceName前綴。

2. 雖然代碼中是通過SetString進行存儲,由於存儲的JSON序列化對象,所以Redis自動識別對象類型爲hash。

3. 存儲的中文在緩存服務器中是轉碼後的。

參考文章

官方文檔:https://learn.microsoft.com/zh-cn/aspnet/core/performance/caching/overview?view=aspnetcore-6.0

 

以上就是ASP.NET Core MVC 從入門到精通之緩存的全部內容。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章