欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解C#中普通緩存的使用

 更新時間:2021年05月06日 08:26:02   作者:陳大寶  
緩存的概念及優(yōu)缺點在這里就不多做介紹,當(dāng)然緩存包含多種有普通緩存、客戶端緩存、DNS緩存、反向代理緩存以及分布式緩存等等。今天主要聊一聊C#通過編碼來實現(xiàn)普通的緩存、話不多說直接上代碼。

一、首先,新建控制臺程序(.NET Core)、以下為項目結(jié)構(gòu)

  1. CacheHelper緩存幫助類
  2. DemoTest 為測試有無緩存的Demo代碼
  3. Program 你們懂得 就不多說了

二、編寫緩存類

public class CacheHelper
    {
        //緩存容器 
        private static Dictionary<string, object> CacheDictionary = new Dictionary<string, object>();
        /// <summary>
        /// 添加緩存
        /// </summary>
        public static void Add(string key, object value)
        {
            CacheDictionary.Add(key, value);
        }

        /// <summary>
        /// 獲取緩存
        /// </summary>
        public static T Get <T>(string key)
        {
            return (T)CacheDictionary[key];
        }


        /// <summary>
        /// 緩存獲取方法
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="key">緩存字典容器對應(yīng)key</param>
        /// <param name="func">委托方法 傳入操作對象</param>
        /// <returns></returns>
        public static T GetCache<T>(string key, Func<T> func)
        {
            T t = default(T);
            if (CacheHelper.Exsits(key))
            {
                //緩存存在,直接獲取原數(shù)據(jù)
                t = CacheHelper.Get<T>(key);
            }
            else
            {
                //緩存不存在,去生成緩存,并加入容器
                t = func.Invoke();
                CacheHelper.Add(key, t);
            }
            return t;
        }

        /// <summary>
        /// 判斷緩存是否存在
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        public static bool Exsits(string key)
        {
            return CacheDictionary.ContainsKey(key);
        }

public static T GetCache<T>(string key, Func<T> func)我這里直接使用泛型委托封裝了緩存的方法了。當(dāng)然你也可以不封裝直接使用if else 判斷

if (CacheHelper.Exsits(key)){} else{}

但是實際開發(fā)使用緩存應(yīng)該不是一個地方使用緩存、頻繁的使用if else 判斷代碼有點冗余、所有我就使用采用泛型委托方式封裝方法 這個大家可以自行選擇
  以上一般采用靜態(tài)字典添加緩存數(shù)據(jù)、為了有更好的兼容性我這里直接采用泛型(泛型的好處這里就不多說了、總之性能相對更好、能夠提高代碼的重用性)

三、編寫有緩存和沒有緩存方法

public class DemoTest
    {
        /// <summary>
        /// 使用緩存測試
        /// </summary>
        /// <param name="count"></param>
        /// <returns></returns>
        public static List<People> CacheTest(int count)
        {
            People people = new People();


            List<People> ListPeople = new List<People>();
            for (int i = count; i < 100000; i++)
            {
                Console.WriteLine($"------第{i}次請求------");
                //int result = DataSource.GetDataByDB(666);

                //key的名字一定要確保請求的準(zhǔn)確性 DataSource GetDataByDB 666缺一不可
                string key = "DataSource_GetDataByDB_666";
                ListPeople = CacheHelper.GetCache(key, () => DemoTest.GetListData());
                Console.WriteLine($"第{i}次請求獲得的數(shù)據(jù)為:{people}");
           
            }
            return ListPeople;
        }

        /// <summary>
        /// 沒有使用緩存
        /// </summary>
        /// <param name="count"></param>
        /// <returns></returns>
        public static List<People> NoCacheTest(int count)
        {
            People people = new People();


            List<People> ListPeople = new List<People>();
            for (int i = count; i < 100000; i++)
            {
                Console.WriteLine($"------第{i}次請求------");
                //int result = DataSource.GetDataByDB(666);

                //key的名字一定要確保請求的準(zhǔn)確性 DataSource GetDataByDB 666缺一不可
                string key = "DataSource_GetDataByDB_666";

                //if (CacheHelper.Exsits(key))
                //{
                //    //緩存存在,直接獲取原數(shù)據(jù)
                //    result = CacheHelper.Get<int>(key);
                //}
                //else
                //{
                //    //緩存不存在,去生成緩存,并加入容器
                //    result = 78;
                //    CacheHelper.Add(key, result);
                //}
                ListPeople = GetListData();
                Console.WriteLine($"第{i}次請求獲得的數(shù)據(jù)為:{people}");
            }
            return ListPeople;

        }

        /// <summary>
        /// 讀取數(shù)據(jù)源 這里模擬數(shù)據(jù)源讀取 循環(huán)3000
        /// </summary>
        /// <returns></returns>
        public static List<People> GetListData()
        {
            List<People> peoplesList = new List<People>();


            for (int i = 0; i < 3000; i++)
            {
                People people = new People()
                {
                    Age = i,
                    Name = "陳大寶" + i.ToString()
                };

                peoplesList.Add(people);
            }return peoplesList;
        }
    }

四、控制臺上端調(diào)用

class Program
    {
        static void Main(string[] args)
        {

            {
                Console.WriteLine("******************緩存測試****************");
                Stopwatch stopwatch = new Stopwatch();
                stopwatch.Start();

                var iResulr = DemoTest.CacheTest(0);

                stopwatch.Stop();

                Console.WriteLine("有緩存消耗時間為" + stopwatch.ElapsedMilliseconds);
            }
            {
                Console.WriteLine("*****************沒有緩存測試****************");
                Stopwatch stopwatch = new Stopwatch();
                stopwatch.Start();

                var iResulr = DemoTest.NoCacheTest(0);

                stopwatch.Stop();

                Console.WriteLine("沒有緩存消耗時間為" + stopwatch.ElapsedMilliseconds);
            }
        }
    }

循環(huán)10萬次有緩存消耗時間

循環(huán)10萬次沒有有緩存消耗時間

以上為循環(huán)10萬次驗證后分析:以上消耗時間為毫秒、有緩存 22282毫秒大致為0.37分鐘左右。沒有緩存 82417毫秒大致為1.37分鐘左右、兩者相差1分鐘左右、那么有朋友可能會發(fā)現(xiàn)你這也沒快多少啊、但是兄弟們實際我們在訪問時一分鐘已經(jīng)是相當(dāng)久了、你能想象調(diào)用一次接口訪問時間如果超過一分鐘是什么感覺?那毫無疑問肯定得炸毛、而且我們訪問數(shù)據(jù)實際第一次肯定是要到關(guān)系型數(shù)據(jù)中獲取數(shù)據(jù)的、如果使用緩存直接第二次直接取內(nèi)存緩存(不用去再去操作數(shù)據(jù)庫IO了)、但是不使用緩存每次去操作數(shù)據(jù)庫、當(dāng)用戶量稍微多一點數(shù)據(jù)庫它是有性能開銷越來越大、所以緩存是非常有效的、也是我們最能直觀立竿見影的效果。

總結(jié)一下哈:

到這里,緩存的使用基本結(jié)束了。最好值得一提的是,緩存盡量在數(shù)據(jù)量小、重復(fù)查詢量大的情況下使用。因為緩存也是要耗內(nèi)存的,畢竟我們服務(wù)器內(nèi)存是有限的!、當(dāng)然了會有小伙伴會說我們都已經(jīng)用Redis等等、確實現(xiàn)在緩存當(dāng)然用的比較多是Redis了、Redis好處這里就不先談了、總之本次文章是讓沒有了解普通緩存是如何使用得的小伙伴熟悉并了解、其實在這種方式在有些場景也是有它的好處的。

以上就是詳解C#中普通緩存的使用的詳細(xì)內(nèi)容,更多關(guān)于c# 普通緩存的使用的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C# Redis學(xué)習(xí)系列(一)Redis下載安裝使用

    C# Redis學(xué)習(xí)系列(一)Redis下載安裝使用

    這篇文章主要為大家分享了C# Redis學(xué)習(xí)系列教程第一篇, Redis下載、安裝、使用,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • c#結(jié)構(gòu)和類的相關(guān)介紹

    c#結(jié)構(gòu)和類的相關(guān)介紹

    結(jié)構(gòu)和類的共同點都是屬于抽象數(shù)據(jù)類型,包含數(shù)據(jù)和數(shù)據(jù)的操作。不同點在于結(jié)構(gòu)偏重于數(shù)據(jù)語意,而類偏重於行為語意。
    2012-12-12
  • 在C# WinForm應(yīng)用中實現(xiàn)多語種切換功能

    在C# WinForm應(yīng)用中實現(xiàn)多語種切換功能

    本文將介紹如何在一個WinForm應(yīng)用程序中實現(xiàn)多語種切換,通過一個簡單的示例,你將了解到如何使用資源文件管理不同語言的文本,并通過用戶界面實現(xiàn)語言切換,需要的朋友可以參考下
    2024-06-06
  • C#多線程中的互斥鎖Mutex

    C#多線程中的互斥鎖Mutex

    這篇文章介紹了C#多線程中的互斥鎖Mutex,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04
  • C#中調(diào)用命令行cmd開啟wifi熱點的實例代碼

    C#中調(diào)用命令行cmd開啟wifi熱點的實例代碼

    最近想在win7上開啟wifi熱點,于是就弄出下面這個小東西,里面涉及如何在控制臺上輸入命令,分享一下。首先在VS中創(chuàng)建一個window窗口,然后創(chuàng)建兩個四個button,兩個輸入框
    2013-04-04
  • C#中參數(shù)數(shù)組、引用參數(shù)和輸出參數(shù)示例詳解

    C#中參數(shù)數(shù)組、引用參數(shù)和輸出參數(shù)示例詳解

    這篇文章主要給大家介紹了關(guān)于C#中參數(shù)數(shù)組、引用參數(shù)和輸出參數(shù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-05-05
  • 人臉認(rèn)證源碼faceIdentify詳解

    人臉認(rèn)證源碼faceIdentify詳解

    這篇文章主要為大家詳細(xì)介紹了人臉認(rèn)證源碼faceIdentify的相關(guān)代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • 使用C#判斷文件是否為圖片的多種方法

    使用C#判斷文件是否為圖片的多種方法

    在開發(fā)中,我們常需要判斷一個文件是否為圖片,這看似簡單,但要實現(xiàn)得既高效又嚴(yán)謹(jǐn),需要根據(jù)不同場景選擇合適的方法,本文記錄了幾種常見的判斷方式,并推薦使用?SixLabors.ImageSharp?來替代已被淘汰的?System.Drawing,需要的朋友可以參考下
    2024-10-10
  • C#類的訪問修飾符用法分析

    C#類的訪問修飾符用法分析

    這篇文章主要介紹了C#類的訪問修飾符用法,較為詳細(xì)的分析了C#類的訪問修飾符概念與用法,具有一定的參考借鑒價值,需要的朋友可以參考下
    2014-10-10
  • c# TreeView添加右鍵快鍵菜單有兩種方法

    c# TreeView添加右鍵快鍵菜單有兩種方法

    c# TreeView添加右鍵快鍵菜單有兩種方法,需要的朋友可以參考一下
    2013-04-04

最新評論