iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >详解C#中普通缓存的使用
  • 213
分享到

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

2024-04-02 19:04:59 213人浏览 泡泡鱼
摘要

目录一、首先,新建控制台程序(.net core)、以下为项目结构二、编写缓存类三、编写有缓存和没有缓存方法四、控制台上端调用总结一下哈:一、首先,新建控制台程序(.Net Core

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

--结束END--

本文标题: 详解C#中普通缓存的使用

本文链接: https://www.lsjlt.com/news/125145.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 详解C#中普通缓存的使用
    目录一、首先,新建控制台程序(.NET Core)、以下为项目结构二、编写缓存类三、编写有缓存和没有缓存方法四、控制台上端调用总结一下哈:一、首先,新建控制台程序(.NET Core...
    99+
    2024-04-02
  • 详解C++中普通旧数据(POD)的使用
    目录前言一、什么是普通旧数据二、使用步骤三、其他方法总结前言 在开发C++的时候,使用对象是绕不开的话题。很多时候我们关注点都在对象的“高级语义”上,比如&l...
    99+
    2023-03-03
    C++普通旧数据POD使用 C++普通旧数据 C++ 旧数据
  • C++中普通旧数据怎么使用
    本篇内容主要讲解“C++中普通旧数据怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++中普通旧数据怎么使用”吧!一、什么是普通旧数据普通旧数据就是内存中的连续字节序列,是能够被“仅当作...
    99+
    2023-07-05
  • SpringBoot缓存Ehcache的使用详解
    目录为什么引入缓存SpringBoot抽象缓存代码实现添加缓存依赖开启缓存数据缓存@Cacheable@CachePut@CacheEvict集成EhCache添加EhCache依赖...
    99+
    2024-04-02
  • spring缓存cache的使用详解
    目录spring缓存cache的使用springcache配置缓存存活时间spring缓存cache的使用 在spring配置文件中添加schema和spring对缓存注解的支持: ...
    99+
    2024-04-02
  • 详解C++中存储类的使用
    目录auto 存储类register 存储类static 存储类extern 存储类mutable 存储类存储类定义 C++ 程序中变量/函数的范围(可见性)和生命周期。这些说明符放...
    99+
    2022-12-28
    C++存储类使用 C++存储类
  • C#中如何使用缓存流
    这期内容当中小编将会给大家带来有关C#中如何使用缓存流,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。C#缓存流的使用实例:用缓存流复制文件,C#文件处理操作必须先导入命名空间:using Sys...
    99+
    2023-06-17
  • C# .NET 中的缓存实现详情
    目录一、缓存的基本概念二、缓存三、进程内缓存早期做法四、更好的解决方案1、 Microsoft.Extensions.Caching.Memory 2、具有驱逐策略的 IM...
    99+
    2024-04-02
  • mysql select缓存机制使用详解
    mysql Query Cache 默认为打开。从某种程度可以提高查询的效果,但是未必是最优的解决方案,如果有的大量的修改和查询时,由于修改造成的cache失效,会给服务器造成很大的开销,可以通过query...
    99+
    2024-04-02
  • C++普通函数指针怎么使用
    本篇内容介绍了“C++普通函数指针怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!进行C++编写程序时,你经常需要在一个函数中调用其他...
    99+
    2023-06-17
  • 详解redis与spring的整合(使用缓存)
    1、实现目标通过redis缓存数据。(目的不是加快查询的速度,而是减少数据库的负担)  2、所需jar包注意:jdies和commons-pool两个jar的版本是有对应关系的,注意引入jar包是要配对使用,否则将会报错。因为commons...
    99+
    2023-05-31
    spring redis
  • Spring中的@Cacheable缓存注解详解
    目录1 什么是缓存2 本地缓存和集中式缓存3 本地缓存的优点4 Spring对于缓存的支持4.1 spring支持的CacheManager4.2 GuavaCache4.3 引入依...
    99+
    2023-05-20
    Spring @Cacheable Spring 缓存注解
  • 详解Spring缓存注解@Cacheable,@CachePut , @CacheEvict使用
    注释介绍@Cacheable@Cacheable 的作用 主要针对方法配置,能够根据方法的请求参数对其结果进行缓存@Cacheable 作用和配置方法 参数 解释 example ...
    99+
    2023-05-31
    spring cache 注解
  • 详解Python中的普通函数和高阶函数
    目录什么是函数函数的嵌套调用高阶函数我们思考一下计算圆形和方形的面积为何高阶函数能够降低维度总结什么是函数 每个语言都有函数,甚至大家用的Excel里面也有函数,我们以前学习的数学也...
    99+
    2024-04-02
  • RecyclerView详解一,使用及缓存机制
    本文大致会先讲解RecyclerView的基础知识及使用,最后会深入讲解一点原理。当然,本人知识水平有限哈,太深入的东西我现在还没接触到,还请大家包容,阿里嘎多~ 一、RecyclerView的...
    99+
    2023-09-07
    缓存 android kotlin
  • 使用maven创建普通项目命令行程序详解
    目录引言下载并配置Mavenmaven项目的构建通过Maven配置mysql、myBtais、myBtais-plusmaven命令工具引言 maven是一个软件项目管理工具,其核心...
    99+
    2024-04-02
  • 关于Guava缓存详解及使用说明
    目录缓存Guava cache详细配置缓存的并发级别缓存的初始容量设置设置最大存储缓存清除策略显式清除Cache LoadingCache缓存 缓存分为本地缓存与分布式缓存...
    99+
    2022-11-13
    Guava缓存 Guava缓存使用 Guava缓存说明
  • 详解SpringBoot如何使用Redis和Redis缓存
    目录一、配置环境二、Redis的基本操作三、使用redis作缓存一、配置环境 首先,先创建一个SpringBoot项目,并且导入Redis依赖,使用Jedis进行连接测试。 本人的R...
    99+
    2024-04-02
  • 详解Android ViewPager2中的缓存和复用机制
    目录1. 前言 2. 回顾RecyclerView缓存机制 3. offscreenPageLimit原理 4. FragmentStateAdapter原理以及缓存机制 4.1 简...
    99+
    2024-04-02
  • Java本地缓存工具之LoadingCache的使用详解
    目录前言环境依赖代码演示一下总结前言 在工作总常常需要用到缓存,而redis往往是首选,但是短期的数据缓存一般我们还是会用到本地缓存。本文提供一个我在工作中用到的缓存工具,该工具代码...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作