缓存的概念及优缺点在这里就不多做介绍,当然缓存包含多种有普通缓存、客户端缓存、DNS缓存、反向代理缓存以及分布式缓存等等。今天主要聊一聊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#中普通缓存的使用的更多相关文章

  1. [原创]关于mybatis中一级缓存和二级缓存的简单介绍

    关于mybatis中一级缓存和二级缓存的简单介绍 mybatis的一级缓存: MyBatis会在表示会话的SqlSession对象中建立一个简单的缓存,将每次查询到的结果结果缓存起来,当下次查询的时候 ...

  2. 清除oracle中的缓存(具体细节未知, 慎用)

    oracle中的缓存主要是指SGA中的:1.share pool2.database buffer cache清空命令如下:首先要登录到sqlplus命令下,输入如下命令即可:SQL> alte ...

  3. AngularJS中的缓存

    欢迎大家指导与讨论 : ) 缓存篇 一个缓存就是一个组件,它可以透明地储存数据,以便以后可以更快地服务于请求.多次重复地获取资源可能会导致数据重复,消耗时间.因此缓存适用于变化性不大的一些数据,缓存能 ...

  4. 如何在 apache 中设置缓存有效时间

    今天学习了下如何在 apache 中设置缓存时间,记之以备忘. 在 http 报文头中,与缓存时间有关的两个字段是 Expires 以及 Cache-Control 中的 max-age,Expire ...

  5. 谈谈MVC项目中的缓存功能设计的相关问题

    本文收集一些关于项目中为什么需要使用缓存功能,以及怎么使用等,在实际开发中对缓存的设计的考虑 为什么需要讨论缓存呢? 缓存是一个中大型系统所必须考虑的问题.为了避免每次请求都去访问后台的资源(例如数据 ...

  6. iOS中dyld缓存的实现原理是怎样的?

    在iOS开发中,为了提升系统的安全性,很多系统库文件都被打包到一个缓存的文件当中即dyld缓存,那大家对dyld缓存了解多少呢?今天小编将和大家分享的就是一位iOS大神对dyld缓存的使用分析,一起来 ...

  7. angular中$cacheFactory缓存的使用

    最近在学习使用angular,慢慢从jquery ui转型到用ng开发,发现了很多不同点,继续学习吧: 首先创建一个服务,以便在项目中的controller中引用,服务有几种存在形式,factory( ...

  8. 如何在 Linux 中清除缓存(Cache)

              如何在 Linux 中清除缓存(Cache)            方法一: http://mp.weixin.qq.com/s?__biz=MjM5ODAzODgyMQ==&am ...

  9. 菜鸟-手把手教你把Acegi应用到实际项目中(7)-缓存用户信息

    首先讲讲EhCache.在默认情况下,即在用户未提供自身配置文件ehcache.xml或ehcache-failsafe.xml时,EhCache会依据其自身Jar存档包含的ehcache-fails ...

  10. HTTP请求中浏览器缓存

    本文导读:浏览器缓存机制,其实主要就是HTTP协议定义的缓存机制.客户端缓存是否需要是可以在服务端代码上控制的.那就是响应头.响应头告诉缓存器不要保留缓存,缓存器就不会缓存相应内容:如果请求信息是需要 ...

随机推荐

  1. 硬件交互 snmp 使用

    # *********************************snmp使用******************************************** # coding=utf-8 ...

  2. 后端程序员之路 34、Index搜索引擎实现分析3-对文章索引的两层分块

    # part_indexer 对文章根据id的hash进行分块索引- 持有 search_index _inc_index[2]; search_index _history_index[2]; 进行 ...

  3. Java数据持久层

    一.前言 1.持久层 Java数据持久层,其本身是为了实现与数据源进行数据交互的存在,其目的是通过分层架构风格,进行应用&数据的解耦. 我从整体角度,依次阐述JDBC.Mybatis.Myba ...

  4. 2018.8.30 nowcoder oi赛制测试1

    2018.8.30 nowcoder oi赛制测试1 普及组难度,发现了一些问题 A 题目大意:求斐波那契数列\(f(k-1)f(k+1)-f(k)^2\),范围极大 打表可得规律 其实是卡西尼恒等式 ...

  5. Codeforces Round #575 (Div. 3) D2. RGB Substring (hard version) 【递推】

    一.题目 D2. RGB Substring (hard version) 二.分析 思路一开始就想的对的,但是,用memset给数组初始化为0超时了!超时了! 然后我按照题解改了个vector初始化 ...

  6. MySQL优化从执行计划开始(explain超详细)

    前言 小伙伴一定遇到过这样反馈:这页面加载数据太慢啦,甚至有的超时了,用户体验极差,需要赶紧优化: 反馈等同于投诉啊,多有几次,估计领导要找你谈话啦. 于是不得不停下手里头的活,赶紧进行排查,最终可能 ...

  7. 【Azure 云服务】在Cloud Service的代码中如何修改IIS Application Pool的配置呢? 比如IdleTimeout, startMode, Recycling.PeriodicRestart.Time等

    什么是 PaaS?Platform as a Service 平台即服务 (PaaS) 是云中的完整开发和部署环境,你可以使用其中资源交付内容,从基于云的简单应用到启用云的复杂企业应用程序皆可.你以即 ...

  8. PureMVC学习笔记

    一.简介 PureMVC是基于MVC思想和一些基础设计模式建立的一个轻量级的应用框架,免费开源,最初是执行的ActionScript 3语言使用,现在已经移植到几乎所有主流平台.PureMVC官方网站 ...

  9. MongoDB数据库的使用

    MongoDB是一个基于分布式 文件存储的NoSQL数据库,适合存储JSON风格文件的形式. 三元素:数据库.集合和文档. 文档:对应着关系数据库中的行,就是一个对象,由键值对构成,是json的扩展B ...

  10. 彻底搞清Flink中的Window

    窗口 在流处理应用中,数据是连续不断的,因此我们不可能等到所有数据都到了才开始处理.当然我们可以每来一个消息就处理一次,但是有时我们需要做一些聚合类的处理,例如:在过去的1分钟内有多少用户点击了我们的 ...