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

      快訊 來源:博客園 2023-06-23 22:14:30

      隨著技術(shù)的發(fā)展,ASP.NET Core MVC也推出了好長時間,經(jīng)過不斷的版本更新迭代,已經(jīng)越來越完善,本系列文章主要講解ASP.NET Core MVC開發(fā)B/S系統(tǒng)過程中所涉及到的相關(guān)內(nèi)容,適用于初學者,在校畢業(yè)生,或其他想從事ASP.NET Core MVC 系統(tǒng)開發(fā)的人員。


      【資料圖】

      經(jīng)過前幾篇文章的講解,初步了解ASP.NET Core MVC項目創(chuàng)建,啟動運行,以及命名約定,創(chuàng)建控制器,視圖,模型,接收參數(shù),傳遞數(shù)據(jù)ViewData,ViewBag,路由,頁面布局,wwwroot和客戶端庫,Razor語法,EnityFrameworkCore與數(shù)據(jù)庫,HttpContext,Request,Response,Session,序列化,文件上傳,自動映射,Html輔助標簽,模型校驗,鑒權(quán)、授權(quán)基礎(chǔ),Identity入門,日志管理,F(xiàn)ilter(篩選器)等內(nèi)容,今天繼續(xù)講解ASP.NET Core MVC 中緩存等相關(guān)內(nèi)容,僅供學習分享使用。

      緩存的優(yōu)點

      在應用程序中,使用緩存,具有如下優(yōu)點:

      1. 提高應用程序的訪問速度
      2. 適用于不易改變的數(shù)據(jù)

      緩存分類

      根據(jù)緩存的應用范圍和存儲方式,可以分為以下幾種:

      1. 內(nèi)存緩存:這種方式是將內(nèi)容緩存到Web服務器內(nèi)存在,主要適用于單服務器程序,且在服務器重啟后,緩存中的數(shù)據(jù)也會丟失。
      2. 緩存服務器:對于分布式部署的Web系統(tǒng),緩存與內(nèi)存中的方式會造成各個Web服務器中的緩存內(nèi)容不一致,一般都會有獨立的緩存服務器,如Redis,SQL Server等存儲緩存的地方。緩存服務器中的內(nèi)容,不會隨著Web服務器的重啟而變化。
      3. 客戶端:緩存于客戶端一般通過Header實現(xiàn),也可以通過localStorage,Cookie等方式。

      內(nèi)存緩存

      In-Memory緩存,將數(shù)據(jù)緩存在Web服務器內(nèi)存中,適用于單服務器部署的程序。在ASP.NET Core MVC程序中,使用內(nèi)存緩存的步驟如下

      1. 添加緩存服務

      在Program.cs啟動程序中,增加非分布式內(nèi)存緩存服務,如下所示:

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

      2. 注入緩存接口

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

      1 private readonly ILogger _logger;2 3 private readonly IMemoryCache _memoryCache;//內(nèi)存緩存接口4 5 public HomeController(ILogger 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 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             //在被清除緩存時,重新回調(diào),重新填充12             _logger.LogInformation("緩存被清除了.");13         }, this);14         _memoryCache.Set("citys", cityList, memoryCacheEntryOptions);15     }16     ViewBag.Citys = cityList;17     return View();18 }

      4. 參數(shù)說明

      示例中MemoryCacheEntryOptions,主要用于設置內(nèi)存緩存參數(shù),主要有以下幾個參數(shù)可以設置:

      1. AbsoluteExpiration 設置絕對過期時間
      2. SlidingExpiration 滑動過期時間
      3. PostEvictionCallbacks 緩存清除時的回調(diào)函數(shù)

      分布式緩存

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

      與其他將緩存數(shù)據(jù)存儲在單個應用服務器上的緩存方案相比,分布式緩存具有多個優(yōu)勢。分布式緩存的優(yōu)點

      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. 環(huán)境搭建

      使用Redis進行緩存,首先需要搭建Redis環(huán)境。關(guān)于Redis環(huán)境,可參考之前的文章:

      • Redis安裝與啟動:https://www.cnblogs.com/hsiang/p/14224484.html
      • Redis基礎(chǔ)命令: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 logger ,IDistributedCache distributedCache)4 {5     _logger = logger;6     _distributedCache = distributedCache;7 }

      6. 獲取/設置緩存

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

      1 public IActionResult Index() 2 { 3     var cityList = new List(); 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>(obj);14     ViewBag.Citys = cityList;15     return View();16 }

      7. 運行測試

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

      在Redis服務器上進行查看,可以發(fā)現(xiàn):

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

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

      3. 存儲的中文在緩存服務器中是轉(zhuǎn)碼后的。

      參考文章

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

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

      標簽:

      免責聲明:市場有風險,選擇需謹慎!此文僅供參考,不作買賣依據(jù)。

      資訊播報