返回顶部
首页 > 资讯 > 后端开发 > ASP.NET >详解.Net缓存之MemoryCahe
  • 420
分享到

详解.Net缓存之MemoryCahe

2024-04-02 19:04:59 420人浏览 泡泡鱼
摘要

目录1. MemoryCahe1.1 简单入门1.2 过期时间1.2 常用配置1.3 IChangeToken1.4 引用Nuget包1. MemoryCahe netcore中的

1. MemoryCahe

netcore中的缓存和System.Runtime.Caching很相似,但是在功能上做了增强,缓存的key支持object类型;提供了泛型支持;可以读缓存和单个缓存项的大小做限定,可以设置缓存的压缩比例。

通过实现微软官方的Microsoft.Extensions.Caching里面的IDistributedCache接口实现缓存集成到ASPNETCore中

1.1 简单入门

netcore中缓存相关的类库都在 Microsoft.Extensions.Caching ,使用MemoryCache首先安装包


<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="5.0.0" />

注入


        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers();
            //添加缓存配置
            services.AddMemoryCache();
        }

使用


        private readonly IMemoryCache _cache;
        public HomeController(IMemoryCache cache)
        {
            _cache = cache;
        }

        [HttpGet]
        public string Set()
        {
            //写
            _cache.Set("login", "4545478244");
            return "";
        }

        [HttpGet]
        public string Get()
        {
            //读
            var value = _cache.Get("login");
            return "";
        }

1.2 过期时间


            //1.最简单使用方式
            _cache.Set("mykey", "myvalue");
            //2.绝对过期时间,3秒后过期
            _cache.Set("key1", "value1", new DateTimeOffset(DateTime.Now.AddSeconds(3)));
            //3.绝对过期时间,效果同上
            _cache.Set("key2", "value2", TimeSpan.FromSeconds(3));
            //4.滑动过期时间,3秒后,即三秒钟内被访问,则重新刷新缓存时间为3秒后
            _cache.Set("key3", "value3", new MemoryCacheEntryOptions
            {
                SlidingExpiration = TimeSpan.FromSeconds(3),
            });
            Console.WriteLine("-----------暂停2秒");
            Thread.Sleep(2000);//暂停2秒
            Console.WriteLine($"key1的值:{_cache.Get("key1") ?? "key1被清除"}");
            Console.WriteLine($"key2的值:{_cache.Get("key2") ?? "key2被清除"}");
            Console.WriteLine($"key3的值:{_cache.Get("key3") ?? "key3被清除"}");
            Console.WriteLine("-----------暂停2秒");
            Thread.Sleep(2000);//再次暂停2秒
            Console.WriteLine($"key1的值:{_cache.Get("key1") ?? "key1被清除"}");
            Console.WriteLine($"key2的值:{_cache.Get("key2") ?? "key2被清除"}");
            Console.WriteLine($"key3的值:{_cache.Get("key3") ?? "key3被清除"}");

在例子中key1,key2都是使用的绝对过期时间,key3使用的相对过期时间,2秒后第一次访问key1、key2、key3都没过期,其中key3的过期时间刷新了,重新设置为3秒后,所以再次暂停2秒后,key1、key2都过期了,key3仍然存在。

程序运行结果如下:

1.2 常用配置

下边的例子介绍netcore中缓存的常用配置,直接看代码


        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers();

            services.AddMemoryCache(options =>
            {
                //缓存大小
                options.SizeLimit = 3;//如果设置了该值,那么每个set都必须设置size,并且超过了这个值的大小的会自动销毁 
                //缓存满了时,压缩20%(即删除20份优先级低的缓存项)
                options.CompactionPercentage = 0.2;
                //两秒钟查找一次过期项
                options.ExpirationScanFrequency = TimeSpan.FromSeconds(3);
            });
        }

        [HttpGet]
        public string TestSize()
        {
            //SizeLimit配置3
            _cache.Set("item1", "11111", new MemoryCacheEntryOptions
            {
                //缓存大小占1份
                Size = 2
            });
            _cache.Set("item2", "22222", new MemoryCacheEntryOptions
            {
                Size = 2
            });
            var item1 = _cache.Get("item1");//输出 11111
            var item2 = _cache.Get("item2");//输出 null

            return "";
        }

        [HttpGet]
        public string TestOptions()
        {
            //单个缓存项的配置
            MemoryCacheEntryOptions cacheEntityOps = new MemoryCacheEntryOptions()
            {
                //绝对过期时间1
                //AbsoluteExpiration = new DateTimeOffset(DateTime.Now.AddSeconds(2)),
                //绝对过期时间2
                //AbsoluteExpirationRelativeToNow=TimeSpan.FromSeconds(3),
                //相对过期时间
                SlidingExpiration = TimeSpan.FromSeconds(3),
                //优先级,当缓存压缩时会优先清除优先级低的缓存项
                Priority = CacheItemPriority.Low,//优先级等级:Low,NORMal,High,NeverRemove
                //缓存大小占1份
                Size = 1
            };
            //注册缓存项被清除时的回调,可以注册多个回调
            cacheEntityOps.ReGISterPostEvictionCallback((key, value, reason, state) =>
            {
                Console.WriteLine($"回调函数输出【键:{key},值:{value},被清除的原因:{reason}】");
            });
            _cache.Set("mykey", "myvalue", cacheEntityOps);
            Console.WriteLine($"mykey的值:{_cache.Get("mykey") ?? "mykey缓存被清除了"}");
            Console.WriteLine("------------------暂停3秒");
            Thread.Sleep(3000);
            Console.WriteLine($"mykey的值:{_cache.Get("mykey") ?? "mykey缓存被清除了"}");

            return "";
        }

注意netcore中设置缓存和缓存项大小是没有单位的

缓存被清空的回调函数可以注册多个(System.Runtime.Caching清除缓存的回调只能是一个)。

程序执行结果

1.3 IChangeToken

上边我们已经简单了解了通过滑动过期时间和绝对过期时间来控制缓存的有效性,但是有时缓存的过期与否和时间没有联系,比如我们缓存一个文件的内容,不管缓存多久只要文件没有发生变化缓存都是有效的。在net framework中我们可以通过CacheDependency来控制,在Net Core中怎么控制呢?net core中我们可以使用IChangeToken接口轻松实现缓存的过期策略。先看一下IChangeToken接口:


    public interface IChangeToken
    {
        // 是否有变化发生
        bool HasChanged { get; }
        // token是否会调用回调函数,为true时才会有效 
        bool ActiveChangeCallbacks { get; }
        // 注册一个回调函数,当有变化时触发回调
        IDisposable RegisterChangeCallback(Action<object> callback, object state);
    }

看一下IChangeToken实现缓存过期策略的两个例子

1.3.1 监控文件

需要安装组件:Microsoft.Extensions.FileProviders.Physical


    internal class Program
    {
        private static void Main(string[] args)
        {
            string fileName = Path.Combine(Environment.CurrentDirectory, "someCacheData.xml");
            var fileInfo = new FileInfo(fileName);
            MemoryCache myCache = new MemoryCache(new MemoryCacheOptions() { });
            MemoryCacheEntryOptions cacheEntityOps = new MemoryCacheEntryOptions();
            //PollingFileChangeToken是IChangeToken的实现类,通过轮询监控文件变化
            cacheEntityOps.AddExpirationToken(new Microsoft.Extensions.FileProviders.Physical.PollingFileChangeToken(fileInfo));
            //缓存失效时,回调函数
            cacheEntityOps.RegisterPostEvictionCallback((key, value, reason, state) => { Console.WriteLine($"文件【{key}】改动了"); });
            //添加缓存,key为文件名,value为文件内容
            myCache.Set(fileInfo.Name, File.ReadAllText(fileName), cacheEntityOps);
            Console.WriteLine(myCache.Get(fileInfo.Name));
        }
    }

PollingFileChangeToken通过轮询来监控文件有没有发生变化,如果文件中的内容发生改变,缓存就会自动过期。

1.3.2 通过代码控制缓存过期


    class Program
    {
        static void Main(string[] args)
        {
            MemoryCache memoryCache = new MemoryCache(new MemoryCacheOptions());
            MemoryCacheEntryOptions cacheEntityOps = new MemoryCacheEntryOptions();
            //使用CancellationChangeToken控制缓存过期
            CancellationTokenSource tokenSource = new CancellationTokenSource();
            cacheEntityOps.AddExpirationToken(new CancellationChangeToken(tokenSource.Token));
            //设置缓存
            memoryCache.Set("mykey", "myvalue", cacheEntityOps);
            Console.WriteLine(memoryCache.Get("mykey") ?? "缓存被清除了");
            //通过代码清除缓存
            tokenSource.Cancel();
            Console.WriteLine(memoryCache.Get("mykey") ?? "缓存被清除了");
        }
    }

tokenSource.Cancel方法发送取消信号,这个方法会触发缓存过期,基于此我们可以通过Cancel方法灵活的实现自定义的缓存策略。

程序执行结果如下:

1.4 引用Nuget包

直接引用我自己简单封装的一个Nuget包(简单封装自己用,不要嘲笑)


    <PackageReference Include="Common.Cache.MemoryCache" Version="1.1.0" />

注入到容器


        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers();
            //注入
            services.AddMemoryCacheExtension();
        }

使用


        # 在需要使用的地方进行注入
        private readonly IMemoryCachimg  _cache;
        public HomeController(IMemoryCachimg cache)
        {
            _cache = cache;
        }

以上就是详解.net缓存之MemoryCahe的详细内容,更多关于.Net缓存之MemoryCahe的资料请关注编程网其它相关文章!

--结束END--

本文标题: 详解.Net缓存之MemoryCahe

本文链接: https://lsjlt.com/news/125263.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 详解.Net缓存之MemoryCahe
    目录1. MemoryCahe1.1 简单入门1.2 过期时间1.2 常用配置1.3 IChangeToken1.4 引用Nuget包1. MemoryCahe NetCore中的...
    99+
    2024-04-02
  • C# .NET 中的缓存实现详情
    目录一、缓存的基本概念二、缓存三、进程内缓存早期做法四、更好的解决方案1、 Microsoft.Extensions.Caching.Memory 2、具有驱逐策略的 IM...
    99+
    2024-04-02
  • Android图片缓存之Bitmap详解(一)
    前言: 最近准备研究一下图片缓存框架,基于这个想法觉得还是先了解有关图片缓存的基础知识,今天重点学习一下Bitmap、BitmapFactory这两个类。  Bitm...
    99+
    2022-06-06
    bitmap 缓存 Android
  • Mybatis缓存详解
     什么是Mybatis缓存  使用缓存可以减少Java Application与数据库的交互次数,从而提升程序的运行效率。比如,查询id=1的user对象,第一次查询出来之后,会自动将该对象保存到缓存中。下...
    99+
    2024-04-02
  • .NET6开发之实现缓存过程详解
    目录需求目标原理与思路实现使用原生ResponseCaching实现缓存使用Marvin.Cache.Headers实现更多缓存功能一点扩展总结参考资料需求 有的时候为了减少客户端请...
    99+
    2024-04-02
  • Spring源码之循环依赖之三级缓存详解
    目录循环依赖定义三种循环依赖的情况1.构造器循环依赖2.settler循环依赖3.prototype范围的依赖处理三级缓存机制整体分析源码分析面试题总结循环依赖 定义 循环依赖就 循...
    99+
    2024-04-02
  • Android WebView 缓存详解
     Android WebView 缓存详解一. 两种缓存类型:页面缓存:加载一个网页时的html、JS、CSS等页面或者资源数据,这些缓存资源是由于浏览器 的行为而产生,开发者只能通过配置HTTP响应头影响浏览器的行为才能间接地影...
    99+
    2023-05-31
    android webview 缓存
  • JuiceFS 缓存策略详解
    对于一个由对象存储和数据库组合驱动的文件系统,缓存是本地客户端与远端服务之间高效交互的重要纽带。读写的数据可以提前或者异步载入缓存,再由客户端在后台与远端服务交互执行异步上传或预取数据。相比直接与远端服务交互,采用缓存技术可以大大降低存储...
    99+
    2014-10-24
    JuiceFS 缓存策略详解
  • MySQL 查询缓存详解
    文章目录 MySQL 查询缓存介绍MySQL 查询缓存管理和配置MySQL 缓存机制缓存规则缓存机制中的内存管理 MySQL 查询缓存的优缺点优点缺点 MySQL 查询缓存对性能的影响总结 缓存是一个有效且实用的系统性能...
    99+
    2023-08-16
    mysql mysql查询缓存
  • MySQL缓存策略详解
    MySQL缓存方案 一、MySQL缓存方案目的分析1.1、缓存层的作用1.2、缓存层选择1.3、场景分析 二、提升MySQL访问性能的方式2.1、MySQL主从复制2.2、读写分离2.3、连接池2.4、异步连接 三、redi...
    99+
    2023-08-25
    mysql 缓存 数据库 innodb lua
  • Flutter之可滚动组件子项缓存 KeepAlive详解
    本文为大家分析了Flutter之可滚动组件子项缓存 KeepAlive,供大家参考,具体内容如下 首先回想一下,在介绍 ListView 时,有一个addAutomaticKeepA...
    99+
    2022-11-13
    Flutter滚动组件子项缓存KeepAlive Flutter滚动组件缓存 Flutter滚动组件子项缓存
  • Java本地缓存工具之LoadingCache的使用详解
    目录前言环境依赖代码演示一下总结前言 在工作总常常需要用到缓存,而redis往往是首选,但是短期的数据缓存一般我们还是会用到本地缓存。本文提供一个我在工作中用到的缓存工具,该工具代码...
    99+
    2024-04-02
  • 一文掌握.Net core中的缓存
    目录1 Net Framewoke的缓存1.1 System.Web.Caching1.2 System.Runtime.Caching2 Net core的缓存介绍2.1 Memo...
    99+
    2024-04-02
  • .NET MemoryCache如何清除全部缓存
    最近有个需求需要定时清理服务器上所有的缓存。本来以为很简单的调用一下 MemoryCache.Clear 方法就完事了。谁知道 MemoryCache 类以及 IMemoryCach...
    99+
    2024-04-02
  • .Net执行SQL存储过程之易用轻量工具详解
    目录正文【示例1:查询】【示例2:分页】【示例3:增/删/改】【示例4:输出参数】【示例5:存储过程】正文 由于该工具近来被广东省数个公司2B项目采用,且表现稳定,得到良好验证,故...
    99+
    2022-12-20
    .Net执行SQL存储过程工具 .Net SQL存储工具
  • Java关于MyBatis缓存详解
    目录什么是 MyBatis 缓存MyBatis 缓存分类1.⼀级缓存:SqlSession级别,默认开启,并且不能关闭.(默认开启)2.二级缓存:Mapper 级别,默...
    99+
    2024-04-02
  • PHPlaravel缓存cache机制详解
    目录一、访问多个缓存存储二、从缓存中获取数据1.获取数据并设置默认值2.检查缓存项是否存在3.数值增加/减少4.获取 & 存储5.获取 & 删除三、缓存中存储数据1....
    99+
    2022-11-13
    PHP laravel缓存机制 PHP laravel缓存cache PHP laravel 缓存
  • Spring+EHcache缓存实例详解
    一、ehcahe的介绍EhCache 是一个纯Java的进程内缓存框架,具有高速、精干等特点,是Hibernate中默认的CacheProvider。Ehcache是一种广泛使用的开源Java分布式缓存。主要面向通用缓存,Java EE和轻...
    99+
    2023-05-31
    spring ehcache 缓存
  • java缓存框架Caffeine详解
    缓存在日常开发中启动至关重要的作用,基本是存储在内存中,数据的读取速度是非常快的,能大量减少对数据库的访问,减少数据库的压力,本文主要介绍了本地缓存Caffeine基本配置与基本用法,通过阅读本文,你...
    99+
    2023-10-26
    缓存 java
  • MyBatis 延迟加载、一级缓存、二级缓存(详解)
    使用ORM框架我们更多的是使用其查询功能,那么查询海量数据则又离不开性能,那么这篇中我们就看下mybatis高级应用之延迟加载、一级缓存、二级缓存。使用时需要注意延迟加载必须使用resultMap,resultType不具有延迟加载功能。一...
    99+
    2023-05-31
    一级缓存 二级缓存 mybatis
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作