最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解.Net緩存之MemoryCahe

 更新時(shí)間:2021年05月07日 08:54:00   作者:AZRNG  
這篇文章主要介紹了.Net緩存之MemoryCahe的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用.net技術(shù),感興趣的朋友可以了解下

1. MemoryCahe

NetCore中的緩存和System.Runtime.Caching很相似,但是在功能上做了增強(qiáng),緩存的key支持object類型;提供了泛型支持;可以讀緩存和單個(gè)緩存項(xiàng)的大小做限定,可以設(shè)置緩存的壓縮比例。

通過(guò)實(shí)現(xiàn)微軟官方的Microsoft.Extensions.Caching里面的IDistributedCache接口實(shí)現(xiàn)緩存集成到ASPNETCore中

1.1 簡(jiǎn)單入門

netcore中緩存相關(guān)的類庫(kù)都在 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 過(guò)期時(shí)間

            //1.最簡(jiǎn)單使用方式
            _cache.Set("mykey", "myvalue");
            //2.絕對(duì)過(guò)期時(shí)間,3秒后過(guò)期
            _cache.Set("key1", "value1", new DateTimeOffset(DateTime.Now.AddSeconds(3)));
            //3.絕對(duì)過(guò)期時(shí)間,效果同上
            _cache.Set("key2", "value2", TimeSpan.FromSeconds(3));
            //4.滑動(dòng)過(guò)期時(shí)間,3秒后,即三秒鐘內(nèi)被訪問(wèn),則重新刷新緩存時(shí)間為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都是使用的絕對(duì)過(guò)期時(shí)間,key3使用的相對(duì)過(guò)期時(shí)間,2秒后第一次訪問(wèn)key1、key2、key3都沒(méi)過(guò)期,其中key3的過(guò)期時(shí)間刷新了,重新設(shè)置為3秒后,所以再次暫停2秒后,key1、key2都過(guò)期了,key3仍然存在。

程序運(yùn)行結(jié)果如下:

1.2 常用配置

下邊的例子介紹netcore中緩存的常用配置,直接看代碼

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

            services.AddMemoryCache(options =>
            {
                //緩存大小
                options.SizeLimit = 3;//如果設(shè)置了該值,那么每個(gè)set都必須設(shè)置size,并且超過(guò)了這個(gè)值的大小的會(huì)自動(dòng)銷毀 
                //緩存滿了時(shí),壓縮20%(即刪除20份優(yōu)先級(jí)低的緩存項(xiàng))
                options.CompactionPercentage = 0.2;
                //兩秒鐘查找一次過(guò)期項(xiàng)
                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()
        {
            //單個(gè)緩存項(xiàng)的配置
            MemoryCacheEntryOptions cacheEntityOps = new MemoryCacheEntryOptions()
            {
                //絕對(duì)過(guò)期時(shí)間1
                //AbsoluteExpiration = new DateTimeOffset(DateTime.Now.AddSeconds(2)),
                //絕對(duì)過(guò)期時(shí)間2
                //AbsoluteExpirationRelativeToNow=TimeSpan.FromSeconds(3),
                //相對(duì)過(guò)期時(shí)間
                SlidingExpiration = TimeSpan.FromSeconds(3),
                //優(yōu)先級(jí),當(dāng)緩存壓縮時(shí)會(huì)優(yōu)先清除優(yōu)先級(jí)低的緩存項(xiàng)
                Priority = CacheItemPriority.Low,//優(yōu)先級(jí)等級(jí):Low,Normal,High,NeverRemove
                //緩存大小占1份
                Size = 1
            };
            //注冊(cè)緩存項(xiàng)被清除時(shí)的回調(diào),可以注冊(cè)多個(gè)回調(diào)
            cacheEntityOps.RegisterPostEvictionCallback((key, value, reason, state) =>
            {
                Console.WriteLine($"回調(diào)函數(shù)輸出【鍵:{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中設(shè)置緩存和緩存項(xiàng)大小是沒(méi)有單位的

緩存被清空的回調(diào)函數(shù)可以注冊(cè)多個(gè)(System.Runtime.Caching清除緩存的回調(diào)只能是一個(gè))。

程序執(zhí)行結(jié)果

1.3 IChangeToken

上邊我們已經(jīng)簡(jiǎn)單了解了通過(guò)滑動(dòng)過(guò)期時(shí)間和絕對(duì)過(guò)期時(shí)間來(lái)控制緩存的有效性,但是有時(shí)緩存的過(guò)期與否和時(shí)間沒(méi)有聯(lián)系,比如我們緩存一個(gè)文件的內(nèi)容,不管緩存多久只要文件沒(méi)有發(fā)生變化緩存都是有效的。在net framework中我們可以通過(guò)CacheDependency來(lái)控制,在net core中怎么控制呢?net core中我們可以使用IChangeToken接口輕松實(shí)現(xiàn)緩存的過(guò)期策略。先看一下IChangeToken接口:

    public interface IChangeToken
    {
        // 是否有變化發(fā)生
        bool HasChanged { get; }
        // token是否會(huì)調(diào)用回調(diào)函數(shù),為true時(shí)才會(huì)有效 
        bool ActiveChangeCallbacks { get; }
        // 注冊(cè)一個(gè)回調(diào)函數(shù),當(dāng)有變化時(shí)觸發(fā)回調(diào)
        IDisposable RegisterChangeCallback(Action<object> callback, object state);
    }

看一下IChangeToken實(shí)現(xiàn)緩存過(guò)期策略的兩個(gè)例子

1.3.1 監(jiān)控文件

需要安裝組件: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的實(shí)現(xiàn)類,通過(guò)輪詢監(jiān)控文件變化
            cacheEntityOps.AddExpirationToken(new Microsoft.Extensions.FileProviders.Physical.PollingFileChangeToken(fileInfo));
            //緩存失效時(shí),回調(diào)函數(shù)
            cacheEntityOps.RegisterPostEvictionCallback((key, value, reason, state) => { Console.WriteLine($"文件【{key}】改動(dòng)了"); });
            //添加緩存,key為文件名,value為文件內(nèi)容
            myCache.Set(fileInfo.Name, File.ReadAllText(fileName), cacheEntityOps);
            Console.WriteLine(myCache.Get(fileInfo.Name));
        }
    }

PollingFileChangeToken通過(guò)輪詢來(lái)監(jiān)控文件有沒(méi)有發(fā)生變化,如果文件中的內(nèi)容發(fā)生改變,緩存就會(huì)自動(dòng)過(guò)期。

1.3.2 通過(guò)代碼控制緩存過(guò)期

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

tokenSource.Cancel方法發(fā)送取消信號(hào),這個(gè)方法會(huì)觸發(fā)緩存過(guò)期,基于此我們可以通過(guò)Cancel方法靈活的實(shí)現(xiàn)自定義的緩存策略。

程序執(zhí)行結(jié)果如下:

1.4 引用Nuget包

直接引用我自己簡(jiǎn)單封裝的一個(gè)Nuget包(簡(jiǎn)單封裝自己用,不要嘲笑)

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

注入到容器

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

使用

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

以上就是詳解.Net緩存之MemoryCahe的詳細(xì)內(nèi)容,更多關(guān)于.Net緩存之MemoryCahe的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • asp.net DataGrid控件中彈出詳細(xì)信息窗口

    asp.net DataGrid控件中彈出詳細(xì)信息窗口

    在DataGrid控件里單擊某一行的超級(jí)鏈接時(shí),彈出一個(gè)新的頁(yè)面顯示出該行的詳細(xì)信息
    2008-12-12
  • asp.net 文件下載功能函數(shù)代碼整理

    asp.net 文件下載功能函數(shù)代碼整理

    asp.net下文件下載功能代碼,fullFilename 要下載的文件的路徑+文件名,需要的朋友可以參考下。
    2010-04-04
  • .NET Core3.0 日志 logging的實(shí)現(xiàn)

    .NET Core3.0 日志 logging的實(shí)現(xiàn)

    這篇文章主要介紹了.NET Core3.0 日志 logging的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • ASP.NET Ajax級(jí)聯(lián)DropDownList實(shí)現(xiàn)代碼

    ASP.NET Ajax級(jí)聯(lián)DropDownList實(shí)現(xiàn)代碼

    我想大家對(duì)Ajax已耳熟能詳。自web 2.0概念出現(xiàn)以后,提供更好的用戶體驗(yàn)變得越來(lái)越重要。那么今天我來(lái)講解一下如何使用ASP.NET Ajax和web service構(gòu)建無(wú)刷新級(jí)聯(lián)DropDownList(以下簡(jiǎn)稱為級(jí)聯(lián)DDL)。完成的效果圖
    2008-12-12
  • Asp.Net Mvc2 增刪改查DEMO代碼

    Asp.Net Mvc2 增刪改查DEMO代碼

    接觸mvc也有一段時(shí)間了(2.0),也看到園子里很多人在學(xué)習(xí),自己也在園子里面看過(guò)前輩們寫的博客,確實(shí)受益匪淺。本文寫的都是基礎(chǔ)中的基礎(chǔ),僅供想學(xué)習(xí)MVC的新手們?nèi)腴T之作
    2012-10-10
  • 解決ASP.NET中的各種亂碼問(wèn)題總結(jié)

    解決ASP.NET中的各種亂碼問(wèn)題總結(jié)

    本篇文章主要介紹了解決ASP.NET中的各種亂碼問(wèn)題總結(jié),非常具有實(shí)用價(jià)值,需要的朋友可以參考下。
    2016-12-12
  • asp.net類庫(kù)中添加WebService引用出現(xiàn)問(wèn)題解決方法

    asp.net類庫(kù)中添加WebService引用出現(xiàn)問(wèn)題解決方法

    在Web項(xiàng)目?jī)?nèi)添加WebService的引用是件很簡(jiǎn)單的事情,不過(guò)對(duì)于一些新手朋友來(lái)說(shuō),就沒(méi)有那么簡(jiǎn)單了,因?yàn)樵谔砑拥倪^(guò)程中總會(huì)遇到一些困難,接下來(lái)詳細(xì)介紹如何解決,感興趣的你可不要錯(cuò)過(guò)了啊
    2013-02-02
  • c# .net 生成圖片驗(yàn)證碼的代碼

    c# .net 生成圖片驗(yàn)證碼的代碼

    c# .net 生成圖片驗(yàn)證碼的代碼...
    2007-03-03
  • ASP.NET中Request.Form中文亂碼的解決方法

    ASP.NET中Request.Form中文亂碼的解決方法

    一直以為,只有 Request.QueryString 接收url查詢字符串含中文時(shí)可能會(huì)亂碼(做好編解碼工作,很容易可以避免),碰到的時(shí)候,才知道 Request.Form 接收表單的值中含中文也會(huì)亂碼,以前真是很傻很天真很無(wú)知。
    2011-03-03
  • 微軟官方SqlHelper類 數(shù)據(jù)庫(kù)輔助操作類

    微軟官方SqlHelper類 數(shù)據(jù)庫(kù)輔助操作類

    本文主要介紹微軟官方的數(shù)據(jù)庫(kù)操作類極其使用方法,幫助大家利用已經(jīng)非常成熟的類庫(kù)來(lái)進(jìn)行快速開發(fā)。
    2016-03-03

最新評(píng)論

崇文区| 梅河口市| 巩留县| 昌吉市| 淮北市| 东安县| 广元市| 合川市| 青州市| 柘荣县| 舟山市| 金华市| 肥东县| 库伦旗| 合作市| 台山市| 鹤岗市| 西青区| 吴川市| 松原市| 金川县| 延吉市| 玉龙| 沙洋县| 巴彦县| 潞西市| 保康县| 石柱| 巴中市| 张家川| 武鸣县| 康保县| 龙南县| 紫云| 日照市| 白玉县| 静海县| 项城市| 巴塘县| 岐山县| 鲜城|