NetCore MemoryCache使用

来源:https://www.cnblogs.com/acmeblogs/archive/2019/12/13/12035655.html

引用類庫 1.Install-Package Microsoft.Extensions.Caching.Memory MemoryCacheOptions 緩存配置 1.ExpirationScanFrequency 獲取或設置對過期項的連續掃描之間的最短時間間隔 2.SizeLimit 緩存是沒有 ...


引用類庫

1.Install-Package Microsoft.Extensions.Caching.Memory

MemoryCacheOptions 緩存配置

1.ExpirationScanFrequency 獲取或設置對過期項的連續掃描之間的最短時間間隔

2.SizeLimit 緩存是沒有大小的的,此值設置緩存的份數

3.CompactionPercentage 獲取或設置在超過最大大小時壓縮緩存的數量,優先壓縮優先順序較低的緩存,0.2代表20%

  services.AddMemoryCache(options => {
                // 緩存最大為100份
                //##註意netcore中的緩存是沒有單位的,緩存項和緩存的相對關係
                options.SizeLimit = 2;
                //緩存滿了時候壓縮20%的優先順序較低的數據
                options.CompactionPercentage = 0.2;
                //兩秒鐘查找一次過期項
                options.ExpirationScanFrequency = TimeSpan.FromSeconds(2);
            });

 

 

 

MemoryCacheEntryOptions 單個緩存項配置

1.AbsoluteExpiration 絕對過期時間

2. AbsoluteExpirationRelativeToNow 相對於現在的絕對過期時間

3.SlidingExpiration 滑動過期時間,在時間段範圍內 緩存被再次訪問,過期時間將會被重置

4.Priority 優先順序

5.Size 緩存份數

 public bool Add(string key, object value, int ExpirtionTime = 20)
        {
            if (!string.IsNullOrEmpty(key))
            {
                MemoryCacheEntryOptions cacheEntityOps = new MemoryCacheEntryOptions()
                {
                    //滑動過期時間 20秒沒有訪問則清除
                    SlidingExpiration = TimeSpan.FromSeconds(ExpirtionTime),
                    //設置份數
                    Size = 1,
                    //優先順序
                    Priority = CacheItemPriority.Low,
                };
                //過期回掉
                cacheEntityOps.RegisterPostEvictionCallback((keyInfo, valueInfo, reason, state) =>
                {
                    Console.WriteLine($"回調函數輸出【鍵:{keyInfo},值:{valueInfo},被清除的原因:{reason}】");
                });
                _cache.Set(key, value, cacheEntityOps);
            }
            return true;
        }

完整代碼

1.介面

  public interface ICacheService
    {
        /// <summary>
        ///  新增
        /// </summary>
        /// <param name="key"></param>
        /// <param name="value"></param>
        /// <param name="ExpirtionTime"></param>
        /// <returns></returns>
        bool Add(string key, object value, int ExpirtionTime = 20);


        /// <summary>
        /// 獲取
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        string GetValue(string key);
        /// <summary>
        /// 驗證緩存項是否存在
        /// </summary>
        /// <param name="key">緩存Key</param>
        /// <returns></returns>
        bool Exists(string key);

        /// <summary>
        /// 移除
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        bool Remove(string key);
    }

2. 實現  ICacheService

/// <summary>
    /// 緩存介面實現
    /// </summary>
    public class MemoryCacheService : ICacheService
    {
        protected IMemoryCache _cache;

        public MemoryCacheService(IMemoryCache cache)
        {
            _cache = cache;
        }

        public bool Add(string key, object value, int ExpirtionTime = 20)
        {
            if (!string.IsNullOrEmpty(key))
            {
                MemoryCacheEntryOptions cacheEntityOps = new MemoryCacheEntryOptions()
                {
                    //滑動過期時間 20秒沒有訪問則清除
                    SlidingExpiration = TimeSpan.FromSeconds(ExpirtionTime),
                    //設置份數
                    Size = 1,
                    //優先順序
                    Priority = CacheItemPriority.Low,
                };
                //過期回掉
                cacheEntityOps.RegisterPostEvictionCallback((keyInfo, valueInfo, reason, state) =>
                {
                    Console.WriteLine($"回調函數輸出【鍵:{keyInfo},值:{valueInfo},被清除的原因:{reason}】");
                });
                _cache.Set(key, value, cacheEntityOps);
            }
            return true;
        }

        public bool Remove(string key)
        {
            if (string.IsNullOrEmpty(key))
            {
                return false;
            }
            if (Exists(key))
            {
                _cache.Remove(key);
                return true;
            }
            return false;
        }

        public string GetValue(string key)
        {
            if (string.IsNullOrEmpty(key))
            {
                return null;
            }
            if (Exists(key))
            {
                return _cache.Get(key).ToString();
            }
            return null;
        }

        public bool Exists(string key)
        {
            if (string.IsNullOrEmpty(key))
            {
                return false;
            }

            object cache;
            return _cache.TryGetValue(key, out cache);
        }

    }

大神貼1:https://www.cnblogs.com/mylinx/p/10443494.html

大神貼2:https://www.cnblogs.com/wyy1234/p/10519681.html#_label1_0


您的分享是我們最大的動力!

更多相關文章
  • 本文將介紹在Java程式中如何將Excel工作簿轉為PDF文檔的,包括: 將整個工作簿轉為PDF 將指定工作表轉為PDF 使用工具:Free Spire.XLS for Java (免費版) Jar文件下載及導入: 方法1:通過官網下載。下載後,解壓文件,將lib文件夾下的Spire.Xls.jar ...
  • 場景 JPA入門簡介與搭建HelloWorld(附代碼下載): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103473937 JPA中實現單向多對一的關聯關係: https://blog.csdn.net/BADAO_LIUM ...
  • 一、Task類簡介: Task類是在.NET Framework 4.0中提供的新功能,主要用於非同步操作的控制。它比Thread和ThreadPool提供了更為強大的功能,並且更方便使用。 Task和Task<TResult>類:前者接收的是Action委托類型;後者接收的是Func<TResult ...
  • 問題 在開發一款應用的過程中,我們開發者很難考慮到所有問題,往往會忘記處理一些可能發生的異常。隨之而來的結果就是用戶使用過程中接連不斷的崩潰。所以,我們有必要處理所有未被我們處理的異常。 思路 我們需要做的是,在錯誤發生時保存用戶數據,然後將錯誤直接展示在用戶界面上。 解決 首先,我們打開項目中的 ...
  • 比如我們需要ASP.NET Core 中需要通過PDF來進行某些簡單的報表開發,隨著這並不難,但還是會手忙腳亂的去搜索一些資料,那麼恭喜您,這篇帖子會幫助到您,我們就不會再去浪費一些寶貴的時間。 在本文中我們將要使用DinkToPDF來處理我們在.NET Core Web 程式中進行構建PDF文檔! ...
  • EulerOS其實出來有一段時間了,一直在關註,單是僅僅也只是停留在觀望的階段,目前還沒有接入的打算;正好看到園子里的兄弟分享了華為雲免費試用的活動後,難捺激動的心情,我馬上去申請試用了一臺伺服器。 ...
  • 如果要在程式中使用DbContext,則需要先在Nuget中安裝Microsoft.EntityFrameworkCore.SqlServer ...
  • 原文:https://blogs.msdn.microsoft.com/mazhou/2017/12/12/c-7-series-part-7-ref-returns/ 背景 有兩種方法可以將一個值傳遞給一個方法: 例如,FCL(.NET Framework Class Library)中的Arra ...
一周排行
  • 微信公眾號: "Dotnet9" ,網站: "Dotnet9" ,問題或建議: "請網站留言" , 如果對您有所幫助: "歡迎贊賞" 。 .NET CORE(C ) WPF 抽屜式菜單 閱讀導航 1. 本文背景 2. 代碼實現 3. 本文參考 4. 源碼 1. 本文背景 使用簡單動畫實現抽屜式菜單 ...
  • 在上面abp(net core)+easyui+efcore實現倉儲管理系統——ABP WebAPI與EasyUI結合增刪改查之八(三十四) 文章的學習之後。我們通過前面的八篇文章已經學習了通過WebAPI介面與控制器去實現新增、刪除與修改功能。接下來,我們要在控制器中實現查詢功能。 ...
  • 1.選中項目-->屬性-->生成-->選中 XML文檔文件(xml路徑和該項目相同) 2.選擇生成序列化程式集:自動/開 ...
  • 本筆記摘抄自:https://www.cnblogs.com/PatrickLiu/p/7640873.html,記錄一下學習過程以備後續查用。 一、引言 從今天開始我們開始講結構型設計模式,結構型設計模式有如下幾種:適配器模式、橋接模式、裝飾模式、組合模式、外觀模式、享元模式、代理模式。 創建型設 ...
  • C 中 ConfigureAwait 相關答疑FAQ 在前段時間經常看到園子里有一些文章討論到 ConfigureAwait,剛好今天在微軟官方博客看到了 "Stephen Toub" 前不久的一篇答疑 ConfigureAwait 的一篇文章,想翻譯過來。 原文地址:https://devblog ...
  • 想要實現二維數組中根據某個欄位排序,一般可以通過數組迴圈對比的方式實現。這裡介紹一種更簡單的方法,直接通過PHP函數實現。array_multisort() :可以用來一次對多個數組進行排序,或者根據某一維或多維對多維數組進行排序。詳細介紹可參考PHP手冊:https://www.php.net/m ...
  • 常用的軟體: 播放器: cloundMusic(網易雲音樂) https://music.163.com/#/download PotPlayer(一款強大的視頻播放器) https://daumpotplayer.com/download/ ACDsee(ACDsee圖片編輯器免費版) https ...
  • 發現問題 在一次偶然中,在爬取某個網站時,老方法,打開調試工具查看請求方式,請求攔截,是否是非同步載入,不亦樂乎,當我以為這個網站非常簡單的時候,發現二級網頁的地址和源碼不對應 Ajax非同步載入?源碼也是這樣的 而且這些鏈接直... ...
  • 準備年後要跳槽,所以最近一直再看面試題,並且把收集到的面試題整理了以下發到博客上,希望對大家有所幫助。 首先是集合類的面試題 1. HashMap 排序題,上機題。 已知一個 HashMap<Integer,User>集合, User 有 name(String)和 age(int)屬性。請寫一個方 ...
  • JVM體繫結構圖 Native Interface(本地介面) Java本地介面(Java Native Interface (JNI))允許運行在Java虛擬機(Java Virtual Machine (JVM))上的代碼調用本地程式和類庫,或者被它們調用,這些程式和類庫可以是其它語言編寫的,比 ...
x