<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          ASP.NET Core中的內存緩存

          共 5630字,需瀏覽 12分鐘

           ·

          2020-11-20 00:40


          ASP.NET Core中的內存中緩存

          讓我們看看如何通過緩存優(yōu)化ASP.NET Core應用程序性能

          我相信,在我們的工作中,每個人都收到來自客戶的請求或來自我們應用程序用戶的反饋,以提高響應速度。

          如果在編寫代碼時僅使用最佳實踐還不夠,那么我們肯定需要使用緩存來微調我們的應用程序。

          緩存包括將那些不經(jīng)常更改的信息存儲在某個地方。高頻訪問是我們應用程序的業(yè)務要求。

          在本文中,我們將看到ASP.NET Core可用于緩存的內容。

          IMemoryCache和IDistributedCache

          這兩個接口代表.NET Core中用于緩存的內置機制。您可能已經(jīng)聽說過的所有其他技術都是這兩個接口的實現(xiàn)。在本文中,我們將詳細介紹內存緩存,而在以后的文章中將研究分布式緩存。

          在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(this IMemoryCache cache, object key);
          public static TItem Set(this IMemoryCache cache, object key, TItem value, MemoryCacheEntryOptions options);
          public static bool TryGetValue(this IMemoryCache cache, object key, out TItem value); ...}

          注冊后,該接口可以注入到我們要使用它的類構造函數(shù)中,如下所示:

          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());    returnThis is a test method...”;}

          此方法接受兩個參數(shù),第一個是鍵,用于標識緩存的對象,第二個參數(shù)是我們要存儲的值。要從緩存中檢索對象,請使用Get ()方法,如下面的代碼片段所示。

          [HttpGet(“{key}”)]public string Get(string key){    return cache.Get(key);}

          如果我們不確定緩存中是否存在特定的密鑰,則可以使用TryGetValue()方法進行幫助:它返回一個布爾值,指示所請求的密鑰存在或不存在。

          下面是如何使用TryGetValue修改Get()方法的方法。

          [HttpGet(“{key}”)]public string Get(string key){    string obj;    if (!cache.TryGetValue(key, out obj))
          obj = DateTime.Now.ToString(); cache.Set(key, obj);
          return obj;}

          可用的另一種方法是GetOrCreate()方法,該方法驗證所需密鑰的存在,否則,該方法將為您創(chuàng)建它。

          [HttpGet(“{key}”)]public string Get(string key){    return cache.GetOrCreate(“key”,        cacheEntry => {            return DateTime.Now.ToString();        });}

          如何在ASP.NET Core中的緩存數(shù)據(jù)上設置過期策略

          當我們使用IMemoryCache存儲對象時,MemoryCacheEntryOptions類為我們提供了各種技術來管理緩存數(shù)據(jù)的到期時間。

          我們可以指定一個固定的時間,在該時間之后某個特定的密鑰將過期(絕對過期),或者如果在某個特定的時間(滑動過期)之后沒有訪問它,則它可以過期。此外,還可以使用Expiration Token在緩存的對象之間創(chuàng)建依賴關系。這里有一些例子

          //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 backgroundprivate 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 PostEvictionCallBackprivate async void RefreshAllPlacesCache_PostEvictionCallback(object key, object value, EvictionReason reason, object state){ // Regenerate a set of updated data var places = await GetLongGeneratingData(); Cache.Set(CACHE_KEY_PLACES, places, TimeSpan.FromMinutes(40));
          // Re-set the cache to be reloaded in 35min UpdateReset();}

          緩存回調

          MemoryCacheEntryOptions類提供的另一個有趣功能是允許我們注冊回調的功能,當從緩存中刪除一項時將執(zhí)行該回調。

          MemoryCacheEntryOptions cacheOption = new MemoryCacheEntryOptions()  {      AbsoluteExpirationRelativeToNow = (DateTime.Now.AddMinutes(1) - DateTime.Now),  };  cacheOption.RegisterPostEvictionCallback(      (key, value, reason, substate) =>      {          Console.Write("Cache expired!");      }); 

          緩存標簽助手

          到目前為止,我們已經(jīng)看到.NET Core提供的API的使用,從而能夠直接使用IMemoryCache接口手動在緩存中寫入和讀取項目。此接口還有其他實現(xiàn),可能非常有用。例如,在Web環(huán)境中,如果我們使用.NET Core MVC框架,則可以使用helper cache tag存儲部分頁面。它非常簡單易用:您可以將視圖的一部分包裝在緩存標簽中以啟用緩存:

          Ora: @DateTime.Now

          對于頁面的每個后續(xù)請求(包含此標記),將從緩存中使用該段的正文。如果將其放在頁面上并觀察其輸出,則可以輕松檢查行為。當然,我們使用它的方式僅出于示例目的,但是當您嘗試渲染需要大量資源的頁面時,您可以欣賞它的功能。一個明顯的緩存候選是視圖組件[1]調用

           expires-on="@TimeSpan.FromSeconds(600)">@await Component.InvokeAsync("BlogPosts", new { tag = "popular" })

          在上一個代碼段中,您還可以通過屬性expires-on來了解如何管理緩存中對象的過期期限。還有其他兩種選擇:

          ?過期時間:將使用TimeSpan進行評估以指示一段時間,此后必須重新生成內容;?過期滑動:還應使用指示閑置時間的TimeSpan。每次從緩存中讀取內容時,都會將其刪除延遲。

          另一個可定制方面涉及配置緩存標準的可能性。我們可能需要根據(jù)一些變量來更新緩存的對象。一些要求是由覆蓋變化經(jīng)過下列屬性:

          ?按路由變化:通過路由參數(shù)的名稱(例如id)進行了增強,以指示在指示的屬性更改時必須重新生成內容;?因查詢而異:當更改查詢字符串鍵時,將生成并緩存內容;?按用戶不同:當我們顯示已登錄用戶的特定數(shù)據(jù)時(例如,包含名稱和照片的個人資料框),必須將其設置為true;?按標題變化:如果我們使用HTTP請求標頭顯示語言內容,則根據(jù)HTTP請求標頭來更改緩存,例如“ Accept-Language”。?cookie-variable-by-cookie:允許您根據(jù)cookie的內容更改緩存,我們必須指出其名稱。

          可以使用一個或多個按屬性的屬性來執(zhí)行高級緩存策略,但是,有句著名的名言:“功能強大,責任重大”。

          結論

          使用內存緩存可以使您將數(shù)據(jù)存儲在服務器的內存中,并通過刪除對外部數(shù)據(jù)源的不必要請求來幫助我們提高應用程序性能。如我們所見,它非常易于使用。

          我提醒您,當您的應用程序托管在多臺服務器或云托管環(huán)境中時,不能使用這種方法。在下一篇文章中,我們將討論分布式緩存。

          下次見!

          References

          [1]?組件:?https://www.blexin.com/en-US/Article/Blog/Kestrel-build-me-up-31



          往期精彩回顧




          【推薦】.NET Core開發(fā)實戰(zhàn)視頻課程?★★★

          .NET Core實戰(zhàn)項目之CMS 第一章 入門篇-開篇及總體規(guī)劃

          【.NET Core微服務實戰(zhàn)-統(tǒng)一身份認證】開篇及目錄索引

          Redis基本使用及百億數(shù)據(jù)量中的使用技巧分享(附視頻地址及觀看指南)

          .NET Core中的一個接口多種實現(xiàn)的依賴注入與動態(tài)選擇看這篇就夠了

          10個小技巧助您寫出高性能的ASP.NET Core代碼

          用abp vNext快速開發(fā)Quartz.NET定時任務管理界面

          在ASP.NET Core中創(chuàng)建基于Quartz.NET托管服務輕松實現(xiàn)作業(yè)調度

          現(xiàn)身說法:實際業(yè)務出發(fā)分析百億數(shù)據(jù)量下的多表查詢優(yōu)化

          關于C#異步編程你應該了解的幾點建議

          C#異步編程看這篇就夠了


          瀏覽 43
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  2024国产高清无码 | 丁香婷| 五月丁香伊人 | 无码一区二区吧 | 日韩视频中文字幕在线 |