.NET Core針對緩存提供了很好的支持 ,我們不僅可以選擇將數據緩存在應用進程自身的記憶體中,還可以採用分散式的形式將緩存數據存儲在一個“中心資料庫”中。對於分散式緩存,.NET Core提供了針對Redis和SQL Server的原生支持。除了這個獨立的緩存系統之外,ASP.NET Core還借... ...
.NET Core針對緩存提供了很好的支持 ,我們不僅可以選擇將數據緩存在應用進程自身的記憶體中,還可以採用分散式的形式將緩存數據存儲在一個“中心資料庫”中。對於分散式緩存,.NET Core提供了針對Redis和SQL Server的原生支持。除了這個獨立的緩存系統之外,ASP.NET Core還藉助一個中間件實現了“響應緩存”,它會按照HTTP緩存規範對整個響應實施緩存。ASP.NET Core 支持多種不同的緩存。
常見緩存響應的四種方式
1、記憶體緩存
顧名思義,緩存在記憶體中,生命周期預設伴隨應用程式
2、響應緩存
響應緩存可減少客戶端或代理到 web 伺服器發出的請求數。 響應緩存還減少了工作的 web 伺服器執行以生成響應。 響應緩存控制標頭,指定要如何客戶端、 代理和響應緩存中間件。
3、響應緩存中間件
Microsoft.AspNetCore.ResponseCaching 包中的ResponseCaching
4、分散式緩存
比較常用的是基於Redis和資料庫的分散式緩存。
在這裡我們重點說說記憶體緩存和分散式緩存。
如果你看到這段文字,說明您正使用RSS閱讀或轉自《一棵樹-博客園》,原文地址:https://www.cnblogs.com/atree/p/netcore-Distributed-Cache.html
將數據緩存在記憶體中-記憶體緩存
與針對資料庫和遠程服務調用這種IO操作來說,應用針對記憶體的訪問性能將提供不止一個數量級的提升,所以將數據直接緩存在應用進程的內容中自然具有最佳的性能優勢。與基於記憶體的緩存相關的應用編程介面定義在NuGet包“Microsoft.Extensions.Caching.Memory”中,具體的緩存實現在一個名為MemoryCache的服務對象中,後者是我們對所有實現了IMemoryCache介面的所有類型以及對應對象的統稱。由於是將緩存對象直接置於記憶體之中,中間並不涉及持久化存儲的問題,自然也就無需考慮針對緩存對象的序列化問題,所以這種記憶體模式支持任意類型的緩存對象。
針對緩存的操作不外乎對緩存數據的存與取,這兩個基本的操作都由上面介紹的這個MemoryCache對象來完成。如果我們在一個ASP.NET Core應用對MemoryCache服務在啟動時做了註冊,我們就可以在任何地方獲取該服務對象設置和獲取緩存數據,所以針對緩存的編程是非常簡單的。不想看這些,直接看案例。
static void Main (string[] args)
{ MemoryCache memoryCache = new MemoryCache(new MemoryCacheOptions()); memoryCache.Set("name", "tom"); var value = memoryCache.Get("name"); Console.WriteLine(value); Console.ReadKey(); }
設置過期時間:
static void Main (string[] args)
{ MemoryCache memoryCache = new MemoryCache (new MemoryCacheOptions ()); memoryCache.Set ("name", "jack", new MemoryCacheEntryOptions () { AbsoluteExpiration = DateTimeOffset.Now.AddSeconds (5) //設置為5秒後過期 }); while (true) { System.Threading.Thread.Sleep (1000); string value; if (!memoryCache.TryGetValue ("name", out value)) { value = "已過期"; } Console.WriteLine (value); } }
基於記憶體的緩存具有最高的性能,但是由於它實際上是將緩存數據存在承載ASP.NET Core應用的Web服務上,對於部署在集群式伺服器中的應用會出現緩存數據不一致的情況。對於這種部署場景,我們需要將數據緩存在某一個獨立的存儲中心,以便讓所有的Web伺服器共用同一份緩存數據,我們將這種緩存形式稱為“分散式緩存”。ASP.NET Core為分散式緩存提供了兩種原生的存儲形式,一種是基於NoSQL的Redis資料庫,另一種則是微軟自家關係型資料庫SQL Server。
基於Redis的分散式緩存
Redis數目前較為流行NoSQL資料庫,很多的編程平臺都將它作為分散式緩存的首選,接下來我們來演示如何在一個ASP.NET Core應用中如何採用基於Redis的分散式緩存。考慮到一些人可能還沒有體驗過Redis,所以我們先來簡單介紹一下如何安裝Redis。Redis最簡單的安裝方式就是採用Chocolatey(https://chocolatey.org/) 命令行,後者是Windows平臺下一款優秀的軟體包管理工具(類似於NPM)。
採用PowerShell (要求版本在V3以上)命令行
iwr https://chocolatey.org/install.ps1 -UseBasicParsing | iex
或者普通CMD.exe命令行:
@powershell -NoProfile -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))" && SET "PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin"
來安裝Chocolatey。在確保Chocolatey 被本地正常安裝情況下,我們可以執行執行如下的命令安裝或者升級64位的Redis。
C:\>choco install redis-64
C:\>choco upgrade redis-64
Redis伺服器的啟動也很簡單,我們只需要以命令行的形式執行redis-server命令即可。如果在執行該命名之後看到如下圖所示的輸出,則表示本地的Redis伺服器被正常啟動,輸出的結果會指定伺服器採用的網路監聽埠。為了方便管理,可以下載安裝:客戶端工具:RedisDesktopManager。
針對Redis的分散式緩存實現在NuGet包“Microsoft.Extensions.Caching.Redis”之中,所以我們需要確保該NuGet包被正常安裝。不論採用Redis、SQL Server還是其他的分散式存儲方式,針對分散式緩存的操作都實現在DistributedCache這個服務對象向,該服務對應的介面為IDistributedCache。
IDistributedCache介面包含同步和非同步方法。 介面允許在分散式緩存實現中添加、檢索和刪除項。 IDistributedCache介面包含以下方法:
Get、 GetAsync
採用字元串鍵並以byte[]形式檢索緩存項(如果在緩存中找到)。
Set、SetAsync
使用字元串鍵向緩存添加項byte[]形式)。
Refresh、RefreshAsync
根據鍵刷新緩存中的項,並重置其可調過期超時值(如果有)。
Remove、RemoveAsync
根據鍵刪除緩存項。
在項目啟動Setup.cs中註冊:Redis服務
public void ConfigureServices (IServiceCollection services)
{ //將Redis分散式緩存服務添加到服務中 services.AddDistributedRedisCache (options => { //用於連接Redis的配置 Configuration.GetConnectionString("RedisConnectionString")讀取配置信息的串 options.Configuration = "localhost"; // Configuration.GetConnectionString("RedisConnectionString"); //Redis實例名RedisDistributedCache options.InstanceName = "RedisDistributedCache"; }); services.AddMvc (); }
實例對象,構造註入
private DistributedCache _Cache; /// <summary> /// 構造註入 /// </summary> /// <param name="Cache"></param> public ValuesController (IDistributedCache Cache) { _Cache = new DistributedCache (Cache); }
調用DistributedCache 類中的方法
[HttpGet ("{id}")] public string Get (int id) { //添加 bool booladd = _Cache.Add ("id", "sssss"); //驗證 bool boolExists = _Cache.Exists ("id"); //獲取 object obj = _Cache.Get ("id"); //刪除 bool boolRemove = _Cache.Remove ("id"); //修改 bool boolModify = _Cache.Modify ("id", "ssssssss"); return obj.ToString (); }
基於SQL Server的分散式緩存
除了使用Redis這種主流的NoSQL資料庫來支持分散式緩存,微軟在設計分散式緩存時也沒有忘記自家的關係型資料庫採用SQL Server。針對SQL Server的分散式緩存實現在“Microsoft.Extensions.Caching.SqlServer”這個NuGet包中,我們先得確保該NuGet包被正常裝到演示的應用中。
所謂的針對SQL Server的分散式緩存,實際上就是將標識緩存數據的位元組數組存放在SQL Server資料庫中某個具有固定結構的數據表中,因為我們得先來創建這麼一個緩存表,該表可以藉助一個名為sql-cache 的工具來創建。在執行sql-cache 工具創建緩存表之前,我們需要在project.json文件中按照如下的形式為這個工具添加相應的NuGet包“Microsoft.Extensions.Caching.SqlConfig.Tools”。
在 SqlServer 資料庫引擎中創建一個資料庫,命名為:TestDb,打開項目根目錄,執行創建緩存數據表的操作,執行命令後如果輸出信息:Table and index were created successfully. 表示緩存表創建成功.
dotnet sql-cache create "Server=.\SQLEXPRESS;User=sa;Password=123456;Database=TestDb" dbo AspNetCoreCache
在 Startup.cs 中註冊分散式緩存
public void ConfigureServices (IServiceCollection services) { services.AddDistributedSqlServerCache (options => { options.SystemClock = new BLL.LocalSystemClock (); options.ConnectionString = this.Configuration["ConnectionString"]; options.SchemaName = "dbo"; options.TableName = "AspNetCoreCache"; options.DefaultSlidingExpiration = TimeSpan.FromMinutes (1); options.ExpiredItemsDeletionInterval = TimeSpan.FromMinutes (5); }); ... }
在控制器中使用分散式緩存
[Route ("api/Home")] [ApiController] public class HomeController : Controller { private IDistributedCache cache; public HomeController (IDistributedCache cache) { this.cache = cache; } [HttpGet ("Index")] public async Task<ActionResult<string>> SetTime () { var CurrentTime = DateTime.Now.ToString (); await this.cache.SetStringAsync ("CurrentTime", CurrentTime); return CurrentTime; } [HttpGet ("GetTime")] public async Task<ActionResult<string>> GetTime () { var CurrentTime = await this.cache.GetStringAsync ("CurrentTime"); return CurrentTime; } }
就這樣,用起來挺方便的。