c#缓存技术(Dictionary)
无论任何时候,只要传递的参数一致,返回的结果都应该是一致的。这样的函数我们才能够利用缓存。首先我们先定义一个函数,而这个函数将会是我们后面需要缓存的函数:

然后我们修改函数使之能够进行缓存:

这里我们可以看到我们利用了字典来对这个函数进行了缓存。函数首先从字典中判断是否存在参数a的key,如果存在直接返回计算后的结果,如果不存在则计算该结果,并保存到字段中,这样我们就实现了一个简单的缓存。下面我们来看看最终的结果,是不是确实使用了缓存:

当传递参数10的时候,因为缓存中没有所以进行了缓存,参数5也是一样,而下一行再次计算10的时候就没有进行计算而是直接从字典中返回了对应的结果。但是上面这种方式还存在一个问题,如果存在多个函数都需要缓存,则这个类会存在多个字段类型的字段(一些人可能会问为什么不能共享一个字典,这样你就要在key的命名上花费一定的功夫,而且很容易造成重复),那么我们就需要一种能够不污染类的方式来进行缓存,这里我们先介绍如何使用FCSLib中的Memoizer实现内部缓存:

这里我们可以看到Memoizer公开了一个GetMemory的静态方式用来获取对应的缓存对象,然后利用这个返回的对象我们就可以进行缓存,最终的效果跟之前的是一样的,我们可以看看最后控制台输出的结果:

如果你不知道该为这个函数起什么名字,我们可以利用反射来获取这个函数的全称,比如下面这个修改之后的DoSomeThing函数就是利用了这个方式:

当然除了手动修改函数的方式,我们也可以采用自动化来使没有利用缓存的函数使用缓存技术,下面我们来写一个函数来实现这个功能:

我们可以看到红色框住的部分,其实就是利用了闭包,在这个函数之上又嵌套了一层函数,这样我们就能够进行缓存了,只有在缓存中不存在时才调用函数求值,但是面对多个参数的情况,上面这些无法正常缓存了。那么我们就需要使用深度缓存,而所谓的深度缓存就是利用字典套字典来进行保存的,比如下面这个函数,需要传递两个参数,那么对应的缓存就是:

然后就是Main中进行调用:

最后我们可以看到下面的这个结果,第一次调用sfunc(10,5)时建立了缓存,再第二次传递同样的参数调用后可以看到控制台并没有输出对应的字符串:

当然这样字典的嵌套在参数很多的情况下,会显得很复杂,并且也会消耗很多内存。但是当前也没有非常好的解决方案,下面我们还可以利用之前写的Cache函数来实现上面这种多个参数的缓存:

重点是我们红色框住的那部分,具体的嵌套就是第一个字典的key是第一个参数,value就是下个函数的引用,当然这个函数是经过Cache包装之后的,那么自然在调用value的函数之后自然也起到了缓存作用。
c#缓存技术(Dictionary)的更多相关文章
- ASP.NET 缓存技术分析
缓存功能是大型网站设计一个很重要的部分.由数据库驱动的Web应用程序,如果需要改善其性能,最好的方法是使用缓存功能.可能的情况下尽量使用缓存,从内存中返回数据的速度始终比去数据库查的速度快,因而可以大 ...
- 网站缓存技术总结( ehcache、memcache、redis对比)
网站技术高速发展的今天,缓存技术已经成为大型网站的一个关键技术,缓存设计好坏直接关系的一个网站访问的速度,以及购置服务器的数量,甚至影响到用户的体验. 网站缓存按照存放的地点不同,可以分为客户端缓存. ...
- ASP.NET Core 缓存技术 及 Nginx 缓存配置
前言 在Asp.Net Core Nginx部署一文中,主要是讲述的如何利用Nginx来实现应用程序的部署,使用Nginx来部署主要有两大好处,第一是利用Nginx的负载均衡功能,第二是使用Nginx ...
- .Net环境下的缓存技术介绍 (转)
.Net环境下的缓存技术介绍 (转) 摘要:介绍缓存的基本概念和常用的缓存技术,给出了各种技术的实现机制的简单介绍和适用范围说明,以及设计缓存方案应该考虑的问题(共17页) 1 概念 ...
- [.net 面向对象程序设计进阶] (14) 缓存(Cache) (一) 认识缓存技术
[.net 面向对象程序设计进阶] (14) 缓存(Cache)(一) 认识缓存技术 本节导读: 缓存(Cache)是一种用空间换时间的技术,在.NET程序设计中合理利用,可以极大的提高程序的运行效率 ...
- 分布式缓存技术redis学习系列(三)——redis高级应用(主从、事务与锁、持久化)
上文<详细讲解redis数据结构(内存模型)以及常用命令>介绍了redis的数据类型以及常用命令,本文我们来学习下redis的一些高级特性. 安全性设置 设置客户端操作秘密 redis安装 ...
- 分布式缓存技术redis学习系列(一)——redis简介以及linux上的安装
redis简介 redis是NoSQL(No Only SQL,非关系型数据库)的一种,NoSQL是以Key-Value的形式存储数据.当前主流的分布式缓存技术有redis,memcached,ssd ...
- PHP开发中的缓存技术汇总
在PHP开发中,出于对网站服务器负载的考虑,往往需要对页面.数据等内容进行缓存处理,下面就来看看,在PHP开发中有哪些缓存方式吧. 1.页面部分缓存该种方式,是将一个页面中不经常变的部分进行静态缓存, ...
- .Net环境下的缓存技术介绍
.Net环境下的缓存技术介绍 摘要: 介绍缓存的基本概念和常用的缓存技术,给出了各种技术的实现机制的简单介绍和适用范围说明,以及设计缓存方案应该考虑的问题(共17页) 1 概念 1.1 ...
随机推荐
- js在工作中遇到的一些问题
前言 js这种语言没有太多封装好的模式或者统一的编程方式,所以一些细节的问题很容易导致bug,那下面就写为:一份坚固的代码是什么样的. 持续更新一下,记一些good case和bug. 事件绑定的选择 ...
- Codeforces13E - Holes
Portal Description \(n(n\leq10^5)\)个洞排成一条直线,第\(i\)个洞有力量值\(a_i\),当一个球掉进洞\(i\)时就会被立刻弹到\(i+a_i\),直到超出\( ...
- springmvc报406错误
springmvc出现406,无非就两种情况,第一,百分之九十是json包没加进来,第二,百分之十,就是@ResponseBody返回的的数据,在请求的URL中不能有 .html的后缀
- B树、B-树、B+树、B*树【转】,mysql索引
B树 即二叉搜索树: 1.所有非叶子结点至多拥有两个儿子(Left和Right): 2.所有结点存储一个关键字: 3.非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树: 如: B ...
- trigger click 和 click 的区别??
trigger click 和 user click 有什么区别吗? 好像没有的.直到发现了这样一段代码. <button class="btn1">Button< ...
- ios学习- 10大iOS开发者最喜爱的类库
该10大iOS开发者最喜爱的库由“iOS辅导团队”成员Marcelo Fabri组织投票选举而得,参与者包括开发者团队,iOS辅导团队以及行业嘉宾.每个团队都要根据以下规则选出五个最好的库: 1)不能 ...
- java程序调用xfire发布的webService服务
昨天用xfire搭好了一个简单的webService的服务,可以在浏览器访问,今天便想要尝试以下如何调用这个服务及相关的方法.在网上查找了一些资料后,实现过程如下. 1.创建一个maven web项目 ...
- hi3531芯片的标识寄存器
芯片的标识寄存器 0xee0.0xee4.0xee8.0xeec(基址是0x2005_0000) 系统控制器提供了芯片标识(ID)寄存器SC_SYSID.这个标识寄存器是一个概念上 的32bit 的标 ...
- R语言︱决策树族——随机森林算法
每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 笔者寄语:有一篇<有监督学习选择深度学习 ...
- 双硬盘RAID 0全攻略
. RAID53 RAID7即高效数据传送磁盘结构,是RAID3和带区结构的统一,因此它速度比较快,也有容错功能.但价格十分高,不易于实现. 为什么需要磁盘阵列 如何增加磁盘的存取(ac ...