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

一、首先,新建控制台程序(.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# 普通缓存的使用的资料请关注我们其它相关文章!

(0)

相关推荐

  • C#清除WebBrowser中Cookie缓存的方法

    本文实例讲述了C#清除WebBrowser中Cookie缓存的方法.分享给大家供大家参考,具体如下: 最近用C#写一个程序,用一个窗体中的WebBrowser来登陆网站,但是WebBrowser有cookie缓存,第二次登陆的时候WebBrowser仍然是第一次登陆后的状态,所以要清除WebBrowser的cookie缓存. 在stackoverflow上找到一段可用的代码: [DllImport("wininet.dll", CharSet = System.Runtime.Inte

  • C# Cache缓存读取的设置方法

    先创建一个CacheHelper.cs类,代码如下: using System; using System.Web; using System.Collections; using System.Web.Caching;    public class CacheHelper {     /// <summary>     /// 获取数据缓存     /// </summary>     /// <param name="cacheKey">键&l

  • c# 如何用lock解决缓存击穿

    背景 缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力. 解决方案 1.设置热点数据永远不过期. 2.加互斥锁,互斥锁参考代码如下: 2.1.根据key生成object() private static object GetMemoryCacheLockObject(string key) { string cacheLockKey = string.Format(Memor

  • C#实现可缓存网页到本地的反向代理工具实例

    本文实例讲述了C#实现可缓存网页到本地的反向代理工具.分享给大家供大家参考.具体实现方法如下: proxy.ashx 主文件: <%@ WebHandler Language="C#" Class="proxy" %> using System; using System.Web; using System.Net; using System.Text; using System.IO; using System.Collections.Generic;

  • C#中缓存的基本用法总结

    本文初步探讨了C#缓存的原理及应用,并以实例加以分析总结,这些对C#初学者来说是很有必要熟练掌握的内容.具体如下: 一.概述: 缓存应用目的:缓存主要是为了提高数据的读取速度.因为服务器和应用客户端之间存在着流量的瓶颈,所以读取大容量数据时,使用缓存来直接为客户端服务,可以减少客户端与服务器端的数据交互,从而大大提高程序的性能. 1.缓存的引用空间:System.Web.Caching; 缓存命名空间主要提供三种操作:缓存数据对象.对象的缓存依赖和数据库的缓存依赖.其中缓存任何对象都使用一个类C

  • C#中缓存的基本使用方法

    前言 缓存主要是为了提高数据的读取速度.因为服务器和应用客户端之间存在着流量的瓶颈,所以读取大容量数据时,使用缓存来直接为客户端服务,可以减少客户端与服务器端的数据交互,从而大大提高程序的性能. 缓存这个东西可大可小,小到一个静态的字段,大到将整个数据库Cache起来.项目开发过程中缓存的应用到处可见,本文主要介绍一下使用的方法,下面话不多说了,来一起看看详细的介绍吧 1.在ASP.NET中页面缓存的使用方法简单,只需要在aspx页的顶部加上一句声明即可: <%@ OutputCache Dur

  • C#函数式编程中的缓存技术详解

    缓存技术 该节我们将分成两部分来讲解,第一部分为预计算,第二部分则为缓存.缓存这个技术对应从事开发的人员来说是非常熟悉的,从页面缓存到数据库缓存无处不在,而其最重要的特点就是在第一次查询后将数据缓存,在以后的查询过程中就无需重新计算而直接从内存中将结果返回,大大提高了性能,而我们这里的缓存则集中运用在函数上.  预计算 可能一些人并不能立马理解这个词的含义,所以我们就简单的从生活例子出发介绍一下.很多人在工作中一定会这样做事,比如上级吩咐了你一件事,但是这件事的后半部分要等另一个同事做好之后把对

  • C#实现清除IE浏览器缓存的方法

    本文实例讲述了C#实现清除IE浏览器缓存的方法.分享给大家供大家参考.具体如下: 项目中碰到wpf webbrowser的几个问题,在此记录一下 1.webbrowser中对于jquery的bind事件的处理. 在普通的浏览器下一下这种写法没有任何问题 var content = $("<div><h4><span>" + category_name + "</span>(<a id='href_" + guid

  • C#利用缓存分块读写大文件

    C#利用缓存分块读写大文件,供大家参考,具体内容如下 在日常生活中,可能会遇到大文件的读取,不论是什么格式,按照储存文件的格式读取大文件,就会在Buffer中看到相关的文件头合内容, 以一次.txt文件存取为例. using System.IO; 首先创建demo文件,此处文件大小没关系,只是演示 private void button2_Click(object sender, EventArgs e) { using (FileStream fsWrite = new FileStream(

  • C#自定义缓存封装类实例

    本文实例讲述了C#自定义缓存封装类.分享给大家供大家参考.具体如下: 这个自定义的C#类封装了部分常用的缓存操作,包括写入缓存,读取缓存,设置缓存过期时间等等,简化了C#的缓存操作,代码非常简单,易于阅读. using System; using System.Web; namespace DotNet.Utilities { /// <summary> /// 缓存相关的操作类 /// </summary> public class DataCache { /// <sum

随机推荐