<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 使用 內(nèi)存緩存

          共 4001字,需瀏覽 9分鐘

           ·

          2021-01-26 17:22


          ASP.NET Core 是一個(gè)輕量級(jí),模塊化的框架,常用來在 Windows,Linux 和 MacOS 上構(gòu)建高性能,現(xiàn)代化的web框架,不像過去的 Asp.NET,在 ASP.NET Core 中并沒有內(nèi)置 Cache 對(duì)象,不過你可以通過 nuget 上的擴(kuò)展實(shí)現(xiàn)如下三種 cache:

          • in-memory caching
          • distributed caching
          • response caching

          在本文中,我們來看看如何將那些不易變的數(shù)據(jù)灌到內(nèi)存中實(shí)現(xiàn) ASP.NET Core application 的高性能,然后我會(huì)用一些例子來說明這些概念。

          如何啟用 in-memory cache

          要想將?in-memory cache?集成到 ASP.NET Core 中,就需要將其注入到 ServiceCollection 容器,如下代碼所示:


          public?void?ConfigureServices(IServiceCollection?services)
          {
          ????services.AddMvc();
          ????services.AddMemoryCache();
          }

          集成好之后,接下來了解一下緩存的統(tǒng)一接口:IMemoryCache ,代碼如下:


          public?interface?IMemoryCache?:?IDisposable
          {
          ????bool?TryGetValue(object?key,?out?object?value);
          ????ICacheEntry?CreateEntry(object?key);
          ????void?Remove(object?key);
          }

          那如何在 Controller 中使用呢?可以使用 Controller 的構(gòu)造函數(shù)實(shí)現(xiàn)注入,如下代碼所示:


          ????public?class?HomeController?:?Controller
          ????{
          ????????private?readonly?ILogger?_logger;
          ????????private?IMemoryCache?cache;

          ????????public?HomeController(ILogger?logger,?IMemoryCache?cache)
          ????????{
          ???????????_logger?=?logger;
          ????????}
          ????}

          到現(xiàn)在為止,in-memory caching 的配置全部做完,現(xiàn)在可以考慮如何實(shí)現(xiàn)從 Cache 讀取和寫入了。

          Cache的讀取和寫入

          利用 IMemoryCache 接口的?Set()?可實(shí)現(xiàn)向緩存中寫入數(shù)據(jù),請(qǐng)注意這個(gè)?Set()?方法接收兩個(gè)參數(shù),第一個(gè)參數(shù)是緩存的名字,第二個(gè)參數(shù)就是你要緩存的內(nèi)容,如下代碼所示:


          ????????public?IActionResult?Index()
          ????????{
          ????????????cache.Set("IDGKey",?DateTime.Now.ToString());
          ????????????return?View();
          ????????}

          從 Cache 中提取內(nèi)容,需要使用 IMemoryCache 接口的?TryGet()?方法,下面是對(duì) Index 方法的一個(gè)修改版本,代碼如下:


          ????????public?IActionResult?Index()
          ????????{
          ????????????string?key?=?"IDGKey";

          ????????????string?obj;
          ????????????if?(!cache.TryGetValue<string>(key,?out?obj))
          ????????????{
          ????????????????obj?=?DateTime.Now.ToString();
          ????????????????cache.Set<string>(key,?obj);
          ????????????}

          ????????????ViewBag.Cache?=?obj;

          ????????????return?View();
          ????????}

          還有一個(gè)叫做?GetOrCreate?方法,從名字上就能看出來,如果獲取不到就會(huì)創(chuàng)建一個(gè),如下代碼所示:


          ????????public?IActionResult?Index()
          ????????{
          ????????????cache.GetOrCreate<string>("IDGKey",?cacheEntry?=>
          ????????????{
          ????????????????return?DateTime.Now.ToString();
          ????????????});

          ????????????return?View();
          ????????}

          對(duì)了,除了同步版本的?GetOrCreate,還有一個(gè)支持異步的?GetOrCreateAsync

          Cache 的過期策略

          可以對(duì)緩存數(shù)據(jù)指定過期策略,比如說:絕對(duì)過期時(shí)間?和?滑動(dòng)過期時(shí)間,前者表示緩存數(shù)據(jù)的絕對(duì)存活時(shí)間,時(shí)間一到就會(huì)立即移除,后者表示指定的時(shí)間間隔內(nèi)數(shù)據(jù)沒有被訪問到,那么就會(huì)被移除,如果不明白的化,參考 Session 的過期機(jī)制。

          要想設(shè)置過期策略,可以通過?MemoryCacheEntryOptions?類來配置,如下代碼所示:


          ????????public?IActionResult?Index()
          ????????{
          ????????????MemoryCacheEntryOptions?cacheExpirationOptions?=?new?MemoryCacheEntryOptions();

          ????????????cacheExpirationOptions.AbsoluteExpiration?=?DateTime.Now.AddMinutes(30);

          ????????????cacheExpirationOptions.Priority?=?CacheItemPriority.Normal;

          ????????????cache.Set<string>("IDGKey",?DateTime.Now.ToString(),?cacheExpirationOptions);

          ????????????return?View();
          ????????}

          值得注意的是上面的?Priority?屬性,它的應(yīng)用場景是這樣的,當(dāng)應(yīng)用程序內(nèi)存不夠時(shí)要回收內(nèi)存的過程中,誰的優(yōu)先級(jí)低就會(huì)被優(yōu)先移除,除了Normal 枚舉,還有其他諸如:Low, High, NeverRemove?,除了?NeverRemove?,其他的幾種都會(huì)被回收機(jī)制管控。

          新的 Cache 機(jī)制還提供了一個(gè)????的方式,那就是?回調(diào)函數(shù)?注入,意味著當(dāng) cache 過期被移除時(shí)會(huì)自動(dòng)觸發(fā)你指定的回調(diào)函數(shù),你可以在?回調(diào)函數(shù)?中做一些你自定義的業(yè)務(wù)邏輯,比如重新給 cache 注入值,如下代碼所示:


          ????????public?IActionResult?Index()
          ????????{
          ????????????MemoryCacheEntryOptions?cacheExpirationOptions?=?new?MemoryCacheEntryOptions();

          ????????????cacheExpirationOptions.RegisterPostEvictionCallback((obj1,?obj2,?reason,?obj3)?=>
          ????????????{
          ????????????????//callback

          ????????????},?this);

          ????????????cache.Set<string>("IDGKey",?DateTime.Now.ToString(),?cacheExpirationOptions);

          ????????????return?View();
          ????????}

          你甚至還可以配置兩個(gè) cache 的依賴關(guān)系,舉個(gè)例子,如果某一個(gè)?cache item?被移除了,你希望它關(guān)聯(lián)的 cache 也要自動(dòng)移除,看起來是不是很 nice,篇幅有限,我會(huì)在后面的文章中和大家闡述如何去實(shí)現(xiàn),如果你很想知道,可先參考微軟的MSDN:https://docs.microsoft.com/en-us/aspnet/core/performance/caching/memory?view=aspnetcore-5.0

          譯文鏈接:https://www.infoworld.com/article/3230129/how-to-use-in-memory-caching-in-aspnet-core.html?nsdr=true



          往期精彩回顧




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

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

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

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

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

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

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

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

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

          關(guān)于C#異步編程你應(yīng)該了解的幾點(diǎn)建議

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


          瀏覽 82
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <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>
                  无码人妻一区二区三区在线 | 一极黄色毛片影院 | 久久久久久久久久艹 | 黄色A片免费视频 | 欧美自拍小视频 |