ASP.NET Core中的内存缓存
ASP.NET Core中的內存中緩存
讓我們看看如何通過緩存優化ASP.NET Core應用程序性能
我相信,在我們的工作中,每個人都收到來自客戶的請求或來自我們應用程序用戶的反饋,以提高響應速度。
如果在編寫代碼時僅使用最佳實踐還不夠,那么我們肯定需要使用緩存來微調我們的應用程序。
緩存包括將那些不經常更改的信息存儲在某個地方。高頻訪問是我們應用程序的業務要求。
在本文中,我們將看到ASP.NET Core可用于緩存的內容。
IMemoryCache和IDistributedCache
這兩個接口代表.NET Core中用于緩存的內置機制。您可能已經聽說過的所有其他技術都是這兩個接口的實現。在本文中,我們將詳細介紹內存緩存,而在以后的文章中將研究分布式緩存。
在ASP.NET Core中啟用內存中緩存
我們可以使用ConfigureServices方法將ASP.NET內存中緩存合并到應用程序中。您可以在Startup類中啟用MemoryCache,如下面的代碼片段所示。
public void ConfigureServices(IServiceCollection services) {services.AddMvc();services.AddMemoryCache(); }該AddMemoryCache方法允許我們注冊IMemoryCache接口,如上面提到的,將被用于高速緩存的基礎。下面我們看到框架中接口的定義:
public interface IMemoryCache : IDisposable {bool TryGetValue(object key, out object value);ICacheEntry CreateEntry(object key);void Remove(object key); }接口中提供的方法并不是唯一可用于緩存的方法:我們將在后面看到,存在各種擴展來豐富可用的API并極大地促進其使用。例如:
public static class CacheExtensions {public static TItem Get<titem>(this IMemoryCache cache, object key);public static TItem Set<titem>(this IMemoryCache cache, object key, TItem value, MemoryCacheEntryOptions options);public static bool TryGetValue<titem>(this IMemoryCache cache, object key, out TItem value);... }注冊后,該接口可以注入到我們要使用它的類構造函數中,如下所示:
private IMemoryCache cache; public MyCacheController(IMemoryCache cache){this.cache = cache;}在下面的部分中,我們將研究如何在ASP.NET Core中使用緩存API來存儲和檢索對象。
使用IMemoryCache存儲和檢索項目
要使用IMemoryCache接口寫入對象,請使用Set ()方法,如以下代碼片段所示。
[HttpGet] public string Get() {cache.Set(“MyKey”, DateTime.Now.ToString());return “This is a test method...”; }此方法接受兩個參數,第一個是鍵,用于標識緩存的對象,第二個參數是我們要存儲的值。要從緩存中檢索對象,請使用Get ()方法,如下面的代碼片段所示。
[HttpGet(“{key}”)] public string Get(string key) {return cache.Get<string>(key); }如果我們不確定緩存中是否存在特定的密鑰,則可以使用TryGetValue()方法進行幫助:它返回一個布爾值,指示所請求的密鑰存在或不存在。
下面是如何使用TryGetValue修改Get()方法的方法。
[HttpGet(“{key}”)] public string Get(string key) {string obj;if (!cache.TryGetValue<string>(key, out obj))obj = DateTime.Now.ToString();cache.Set<string>(key, obj);return obj; }可用的另一種方法是GetOrCreate()方法,該方法驗證所需密鑰的存在,否則,該方法將為您創建它。
[HttpGet(“{key}”)] public string Get(string key) {return cache.GetOrCreate<string>(“key”,cacheEntry => {return DateTime.Now.ToString();}); }如何在ASP.NET Core中的緩存數據上設置過期策略
當我們使用IMemoryCache存儲對象時,MemoryCacheEntryOptions類為我們提供了各種技術來管理緩存數據的到期時間。
我們可以指定一個固定的時間,在該時間之后某個特定的密鑰將過期(絕對過期),或者如果在某個特定的時間(滑動過期)之后沒有訪問它,則它可以過期。此外,還可以使用Expiration Token在緩存的對象之間創建依賴關系。這里有一些例子
//absolute expiration using TimeSpan _cache.Set("key", item, TimeSpan.FromDays(1));//absolute expiration using DateTime _cache.Set("key", item, new DateTime(2020, 1, 1));//sliding expiration (evict if not accessed for 7 days) _cache.Set("key", item, new MemoryCacheEntryOptions {SlidingExpiration = TimeSpan.FromDays(7) });//use both absolute and sliding expiration _cache.Set("key", item, new MemoryCacheEntryOptions {AbsoluteExpirationRelativeToNow = TimeSpan.FromDays(30),SlidingExpiration = TimeSpan.FromDays(7) })// This method adds a trigger to refresh the data from background private void UpdateReset() {var mo = new MemoryCacheEntryOptions();mo.RegisterPostEvictionCallback(RefreshAllPlacessCache_PostEvictionCallback);mo.AddExpirationToken(new CancellationChangeToken(new CancellationTokenSource(TimeSpan.FromMinutes(35)).Token));Cache.Set(CACHE_KEY_PLACES_RESET, DateTime.Now, mo); }// Method triggered by the cancellation token that triggers the PostEvictionCallBack private async void RefreshAllPlacesCache_PostEvictionCallback(object key, object value, EvictionReason reason, object state) {// Regenerate a set of updated datavar places = await GetLongGeneratingData();Cache.Set(CACHE_KEY_PLACES, places, TimeSpan.FromMinutes(40));// Re-set the cache to be reloaded in 35minUpdateReset(); }緩存回調
MemoryCacheEntryOptions類提供的另一個有趣功能是允許我們注冊回調的功能,當從緩存中刪除一項時將執行該回調。
MemoryCacheEntryOptions cacheOption = new MemoryCacheEntryOptions() { AbsoluteExpirationRelativeToNow = (DateTime.Now.AddMinutes(1) - DateTime.Now), }; cacheOption.RegisterPostEvictionCallback( (key, value, reason, substate) => { Console.Write("Cache expired!"); });緩存標簽助手
到目前為止,我們已經看到.NET Core提供的API的使用,從而能夠直接使用IMemoryCache接口手動在緩存中寫入和讀取項目。此接口還有其他實現,可能非常有用。例如,在Web環境中,如果我們使用.NET Core MVC框架,則可以使用helper cache tag存儲部分頁面。它非常簡單易用:您可以將視圖的一部分包裝在緩存標簽中以啟用緩存:
<cache> <p>Ora: @DateTime.Now</p> </cache>對于頁面的每個后續請求(包含此標記),將從緩存中使用該段的正文。如果將其放在頁面上并觀察其輸出,則可以輕松檢查行為。當然,我們使用它的方式僅出于示例目的,但是當您嘗試渲染需要大量資源的頁面時,您可以欣賞它的功能。一個明顯的緩存候選是視圖組件[1]調用
<cache expires-on="@TimeSpan.FromSeconds(600)"> @await Component.InvokeAsync("BlogPosts", new { tag = "popular" }) </cache>在上一個代碼段中,您還可以通過屬性expires-on來了解如何管理緩存中對象的過期期限。還有其他兩種選擇:
?過期時間:將使用TimeSpan進行評估以指示一段時間,此后必須重新生成內容;?過期滑動:還應使用指示閑置時間的TimeSpan。每次從緩存中讀取內容時,都會將其刪除延遲。
另一個可定制方面涉及配置緩存標準的可能性。我們可能需要根據一些變量來更新緩存的對象。一些要求是由覆蓋變化經過下列屬性:
?按路由變化:通過路由參數的名稱(例如id)進行了增強,以指示在指示的屬性更改時必須重新生成內容;?因查詢而異:當更改查詢字符串鍵時,將生成并緩存內容;?按用戶不同:當我們顯示已登錄用戶的特定數據時(例如,包含名稱和照片的個人資料框),必須將其設置為true;?按標題變化:如果我們使用HTTP請求標頭顯示語言內容,則根據HTTP請求標頭來更改緩存,例如“ Accept-Language”。?cookie-variable-by-cookie:允許您根據cookie的內容更改緩存,我們必須指出其名稱。
可以使用一個或多個按屬性的屬性來執行高級緩存策略,但是,有句著名的名言:“功能強大,責任重大”。
結論
使用內存緩存可以使您將數據存儲在服務器的內存中,并通過刪除對外部數據源的不必要請求來幫助我們提高應用程序性能。如我們所見,它非常易于使用。
我提醒您,當您的應用程序托管在多臺服務器或云托管環境中時,不能使用這種方法。在下一篇文章中,我們將討論分布式緩存。
下次見!
References
[1]?組件:?https://www.blexin.com/en-US/Article/Blog/Kestrel-build-me-up-31
總結
以上是生活随笔為你收集整理的ASP.NET Core中的内存缓存的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .Net Core in Docker极
- 下一篇: asp.net ajax控件工具集 Au