經過前幾篇文章的講解,初步瞭解ASP.NET Core MVC項目創建,啟動運行,以及命名約定,創建控制器,視圖,模型,接收參數,傳遞數據ViewData,ViewBag,路由,頁面佈局,wwwroot和客戶端庫,Razor語法,EnityFrameworkCore與資料庫,HttpContext,... ...
隨著技術的發展,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 中緩存等相關內容,僅供學習分享使用。
緩存的優點
在應用程式中,使用緩存,具有如下優點:
- 提高應用程式的訪問速度
- 適用於不易改變的數據
緩存分類
根據緩存的應用範圍和存儲方式,可以分為以下幾種:
- 記憶體緩存:這種方式是將內容緩存到Web伺服器記憶體在,主要適用於單伺服器程式,且在伺服器重啟後,緩存中的數據也會丟失。
- 緩存伺服器:對於分散式部署的Web系統,緩存與記憶體中的方式會造成各個Web伺服器中的緩存內容不一致,一般都會有獨立的緩存伺服器,如Redis,SQL Server等存儲緩存的地方。緩存伺服器中的內容,不會隨著Web伺服器的重啟而變化。
- 客戶端:緩存於客戶端一般通過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,主要用於設置記憶體緩存參數,主要有以下幾個參數可以設置:
- AbsoluteExpiration 設置絕對過期時間
- SlidingExpiration 滑動過期時間
- PostEvictionCallbacks 緩存清除時的回調函數
分散式緩存
分散式緩存是由多個應用伺服器共用的緩存,通常作為訪問它的應用伺服器的外部服務進行維護。 分散式緩存可以提高 ASP.NET Core 應用的性能和可伸縮性,尤其是當應用由雲服務或伺服器場托管時。
與其他將緩存數據存儲在單個應用伺服器上的緩存方案相比,分散式緩存具有多個優勢。分散式緩存的優點
- 無需Sticky Session
- 可擴展,適用於多台Web伺服器部署的情況。
- 獨立存儲,Web伺服器重啟不會影響緩存
- 性能更好
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 從入門到精通之緩存的全部內容。
作者:小六公子
出處:http://www.cnblogs.com/hsiang/
本文版權歸作者和博客園共有,寫文不易,支持原創,歡迎轉載【點贊】,轉載請保留此段聲明,且在文章頁面明顯位置給出原文連接,謝謝。
關註個人公眾號,定時同步更新技術及職場文章