.NetCore 緩存的使用(Caching.Memory)


ASP.NET Core 中的內存緩存

MSDN:https://docs.microsoft.com/zh-cn/aspnet/core/performance/caching/memory?view=aspnetcore-5.0

1 引用Caching.Memory

1.1 NuGet安裝Microsoft.Extensions.Caching.Memory

https://www.nuget.org/packages/Microsoft.Extensions.Caching.Memory/5.0.0?_src=template

1.2 Startup.cs的ConfigureServices中添加服務

1.3 代碼中引用

using Microsoft.Extensions.Caching.Memory;

1.4 構造時注入

2 緩存的存取

2.1 Get和Set

Get獲取緩存,如果沒有命中,則用Set設置緩存

        //使用緩存
        public ActionResult CacatDate()
        {
            //基本用法:Get;Set
            //讀取緩存
            string now = cache.Get<string>("cacheNow");

            //如果緩存為null,則設置緩存
            if (now == null)
            {
                now = DateTime.Now.ToString();
                cache.Set("cacheNow", now);
            }

            return JsonResult(now);
        }

2.2 GetOrCreate

如果命中緩存則獲取,否則設置緩存
和使用GetSet效果一樣

        //使用緩存
        public ActionResult CacatDate()
        {
            string now = cache.GetOrCreate("cacheNow", entry =>
            {
                return DateTime.Now.ToString();
            });

            return JsonResult(now);
        }

2.3 設置過期時間

緩存過期的策略有兩種。絕對過期時間和滑動過期時間。
絕對過期時間指:到指定的時間(比如2021年6月1日,或者當前系統日期+1天)后,緩存自動過期。
滑動過期時間指:設定一個滑動時間(比如10S)。如果緩存一直沒有被命中過,則經過這個時間后過期。如果被命中,則重新計時這個時間。
注:如果同時設置兩個策略,則滿足任意一個策略的過期條件就會過期。

        //使用緩存
        public ActionResult CacatDate()
        {
            string now = cache.GetOrCreate("cacheNow", entry =>
            {
                entry.SetAbsoluteExpiration(TimeSpan.FromSeconds(10));//絕對過期時間
                entry.SetSlidingExpiration(TimeSpan.FromSeconds(5));//滑動過期時間(規定時間內命中的話,重新計算時間)

                return DateTime.Now.ToString();
            });

            return JsonResult(now);
        }

2.4 緩存被刪除時的回調函數

注冊一個緩存被刪除時的回調函數:entry.RegisterPostEvictionCallback

https://docs.microsoft.com/en-us/dotnet/api/microsoft.extensions.caching.memory.memorycacheentryextensions.registerpostevictioncallback?view=dotnet-plat-ext-5.0#Microsoft_Extensions_Caching_Memory_MemoryCacheEntryExtensions_RegisterPostEvictionCallback_Microsoft_Extensions_Caching_Memory_MemoryCacheEntryOptions_Microsoft_Extensions_Caching_Memory_PostEvictionDelegate_

        //使用緩存
        public ActionResult CacatDate()
        {
            string now = cache.GetOrCreate("cacheNow", entry =>
            {
                entry.SetAbsoluteExpiration(TimeSpan.FromSeconds(10));//絕對過期時間
                //entry.SetSlidingExpiration(TimeSpan.FromSeconds(5));//滑動過期時間(規定時間內命中的話,重新計算時間)

                entry.RegisterPostEvictionCallback((key, value, reason, state) =>
                {
                    Console.WriteLine("緩存刪除,回調函數");
                });

                return DateTime.Now.ToString();
            });

            return JsonResult(now);
        }

2.5 緩存域

緩存域是Caching.Memory自帶的功能,得以實現緩存依賴。

什么是緩存依賴

通過檢測依賴項緩存是否過期,判斷緩存自身是否過期的一種方式。

測試緩存依賴

目前有兩個模型。加油站和汽油。加油站依賴於汽油。

    /// <summary>
    /// 加油站
    /// </summary>
    public class OilStationModel
    {
        /// <summary>
        /// 加油站名稱
        /// </summary>
        public string OilStationName { get; set; }

        /// <summary>
        /// 加油站包含的汽油
        /// </summary>
        public OilModel Oil { get; set; }
    }
    /// <summary>
    /// 汽油
    /// </summary>
    public class OilModel
    {
        /// <summary>
        /// 汽油名稱
        /// </summary>
        public string OilName { get; set; }
    }

還有兩個獲取數據的函數。獲取加油站信息和獲取汽油信息。
獲取加油站信息的函數嵌套着獲取汽油信息的函數。
加油站信息緩存設置為60秒到期,加油站里汽油的信息設置為5秒到期。
為了方便測試,值都是Set緩存當前時間的秒。

        //獲取加油站信息(60秒緩存過期)
        public OilStationModel GetOilStation()
        {
            OilStationModel oilStationModel = cache.GetOrCreate("oilStationModel", entry =>
             {
                 entry.SetAbsoluteExpiration(TimeSpan.FromSeconds(60));
                 return new OilStationModel
                 {
                     OilStationName = $@"加油站名稱:{DateTime.Now.Second}",
                     Oil = GetOil()
                 };
             });
            return oilStationModel;
        }
        //獲取加油站中的汽油的信息(5秒緩存過期)
        public OilModel GetOil()
        {
            OilModel oilModel = cache.GetOrCreate("oilModel", entry =>
             {
                 entry.SetAbsoluteExpiration(TimeSpan.FromSeconds(5));
                 return new OilModel
                 {
                     OilName = $@"汽油型號:{DateTime.Now.Second}"
                 };
             });
            return oilModel;
        }

最后有一個調用的接口,獲取加油站的信息:

        //緩存域實現緩存依賴
        public ActionResult CacheZone()
        {
            OilStationModel oilStationModel = GetOilStation();

            return JsonResult(oilStationModel);
        }

調用接口,由於在第2S時調用的接口,可以看到加油站名稱和汽油型號都是2。

接下來6秒后再次調用接口,獲取加油站信息,按照加油站信息60S過期的策略,理論上應該取得剛才的加油站信息。
加油站名稱和汽油型號應該還是2。
但是實際上,加油站名稱和汽油型號都是8。
這就是緩存依賴實現的功能。由於依賴項(汽油型號)的緩存過期,使得自身(加油站)的緩存也過期。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM