ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-05-20 19:01:18  阅读:307  来源: 互联网

标签:缓存 return NetCore 过期 加油站 Memory Caching entry public


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。
这就是缓存依赖实现的功能。由于依赖项(汽油型号)的缓存过期,使得自身(加油站)的缓存也过期。

标签:缓存,return,NetCore,过期,加油站,Memory,Caching,entry,public
来源: https://www.cnblogs.com/soraxtube/p/14784948.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有