文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

详解C#中普通缓存的使用

2024-04-02 19:55

关注

一、首先,新建控制台程序(.NET Core)、以下为项目结构

  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">缓存字典容器对应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))
            {
                //缓存存在,直接获取原数据
                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)我这里直接使用泛型委托封装了缓存的方法了。当然你也可以不封装直接使用if else 判断

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

但是实际开发使用缓存应该不是一个地方使用缓存、频繁的使用if else 判断代码有点冗余、所有我就使用采用泛型委托方式封装方法 这个大家可以自行选择
  以上一般采用静态字典添加缓存数据、为了有更好的兼容性我这里直接采用泛型(泛型的好处这里就不多说了、总之性能相对更好、能够提高代码的重用性)

三、编写有缓存和没有缓存方法


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的名字一定要确保请求的准确性 DataSource GetDataByDB 666缺一不可
                string key = "DataSource_GetDataByDB_666";
                ListPeople = CacheHelper.GetCache(key, () => DemoTest.GetListData());
                Console.WriteLine($"第{i}次请求获得的数据为:{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的名字一定要确保请求的准确性 DataSource GetDataByDB 666缺一不可
                string key = "DataSource_GetDataByDB_666";

                //if (CacheHelper.Exsits(key))
                //{
                //    //缓存存在,直接获取原数据
                //    result = CacheHelper.Get<int>(key);
                //}
                //else
                //{
                //    //缓存不存在,去生成缓存,并加入容器
                //    result = 78;
                //    CacheHelper.Add(key, result);
                //}
                ListPeople = GetListData();
                Console.WriteLine($"第{i}次请求获得的数据为:{people}");
            }
            return ListPeople;

        }

        /// <summary>
        /// 读取数据源 这里模拟数据源读取 循环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;
        }
    }

四、控制台上端调用


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);
            }
        }
    }

循环10万次有缓存消耗时间

循环10万次没有有缓存消耗时间

以上为循环10万次验证后分析:以上消耗时间为毫秒、有缓存 22282毫秒大致为0.37分钟左右。没有缓存 82417毫秒大致为1.37分钟左右、两者相差1分钟左右、那么有朋友可能会发现你这也没快多少啊、但是兄弟们实际我们在访问时一分钟已经是相当久了、你能想象调用一次接口访问时间如果超过一分钟是什么感觉?那毫无疑问肯定得炸毛、而且我们访问数据实际第一次肯定是要到关系型数据中获取数据的、如果使用缓存直接第二次直接取内存缓存(不用去再去操作数据库IO了)、但是不使用缓存每次去操作数据库、当用户量稍微多一点数据库它是有性能开销越来越大、所以缓存是非常有效的、也是我们最能直观立竿见影的效果。

总结一下哈:

到这里,缓存的使用基本结束了。最好值得一提的是,缓存尽量在数据量小、重复查询量大的情况下使用。因为缓存也是要耗内存的,毕竟我们服务器内存是有限的!、当然了会有小伙伴会说我们都已经用Redis等等、确实现在缓存当然用的比较多是Redis了、Redis好处这里就不先谈了、总之本次文章是让没有了解普通缓存是如何使用得的小伙伴熟悉并了解、其实在这种方式在有些场景也是有它的好处的。

以上就是详解C#中普通缓存的使用的详细内容,更多关于c# 普通缓存的使用的资料请关注编程网其它相关文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯