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

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

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

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

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

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

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

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

然后就是Main中进行调用:

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

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

重点是我们红色框住的那部分,具体的嵌套就是第一个字典的key是第一个参数,value就是下个函数的引用,当然这个函数是经过Cache包装之后的,那么自然在调用value的函数之后自然也起到了缓存作用。

c#缓存技术(Dictionary)的更多相关文章

  1. ASP.NET 缓存技术分析

    缓存功能是大型网站设计一个很重要的部分.由数据库驱动的Web应用程序,如果需要改善其性能,最好的方法是使用缓存功能.可能的情况下尽量使用缓存,从内存中返回数据的速度始终比去数据库查的速度快,因而可以大 ...

  2. 网站缓存技术总结( ehcache、memcache、redis对比)

    网站技术高速发展的今天,缓存技术已经成为大型网站的一个关键技术,缓存设计好坏直接关系的一个网站访问的速度,以及购置服务器的数量,甚至影响到用户的体验. 网站缓存按照存放的地点不同,可以分为客户端缓存. ...

  3. ASP.NET Core 缓存技术 及 Nginx 缓存配置

    前言 在Asp.Net Core Nginx部署一文中,主要是讲述的如何利用Nginx来实现应用程序的部署,使用Nginx来部署主要有两大好处,第一是利用Nginx的负载均衡功能,第二是使用Nginx ...

  4. .Net环境下的缓存技术介绍 (转)

    .Net环境下的缓存技术介绍 (转) 摘要:介绍缓存的基本概念和常用的缓存技术,给出了各种技术的实现机制的简单介绍和适用范围说明,以及设计缓存方案应该考虑的问题(共17页) 1         概念 ...

  5. [.net 面向对象程序设计进阶] (14) 缓存(Cache) (一) 认识缓存技术

    [.net 面向对象程序设计进阶] (14) 缓存(Cache)(一) 认识缓存技术 本节导读: 缓存(Cache)是一种用空间换时间的技术,在.NET程序设计中合理利用,可以极大的提高程序的运行效率 ...

  6. 分布式缓存技术redis学习系列(三)——redis高级应用(主从、事务与锁、持久化)

    上文<详细讲解redis数据结构(内存模型)以及常用命令>介绍了redis的数据类型以及常用命令,本文我们来学习下redis的一些高级特性. 安全性设置 设置客户端操作秘密 redis安装 ...

  7. 分布式缓存技术redis学习系列(一)——redis简介以及linux上的安装

    redis简介 redis是NoSQL(No Only SQL,非关系型数据库)的一种,NoSQL是以Key-Value的形式存储数据.当前主流的分布式缓存技术有redis,memcached,ssd ...

  8. PHP开发中的缓存技术汇总

    在PHP开发中,出于对网站服务器负载的考虑,往往需要对页面.数据等内容进行缓存处理,下面就来看看,在PHP开发中有哪些缓存方式吧. 1.页面部分缓存该种方式,是将一个页面中不经常变的部分进行静态缓存, ...

  9. .Net环境下的缓存技术介绍

    .Net环境下的缓存技术介绍 摘要: 介绍缓存的基本概念和常用的缓存技术,给出了各种技术的实现机制的简单介绍和适用范围说明,以及设计缓存方案应该考虑的问题(共17页) 1         概念 1.1 ...

随机推荐

  1. 缩减APK包大小

    1)开启minifyEnabled 开启混淆,删除没用的java文件 2)开启shrinkResources 去除无用资源 3)resConfigs "zh" 删除无用的语言资源 ...

  2. HTTP协议报文结构及示例

    HTTP基本架构 下面我们用一张简单的流程图来展示HTTP协议基本架构,以便大家先有个基本的了解. 9.png Web Client可以是浏览器.搜索引擎.机器人等等一切基于HTTP协议发起http请 ...

  3. 【视频编解码·学习笔记】8. 熵编码算法:基本算法列举 & 指数哥伦布编码

    一.H.264中的熵编码基本方法: 熵编码具有消除数据之间统计冗余的功能,在编码端作为最后一道工序,将语法元素写入输出码流 熵解码作为解码过程的第一步,将码流解析出语法元素供后续步骤重建图像使用 在H ...

  4. Java常见加密算法

    常见 package com.example.decript; import java.io.UnsupportedEncodingException; import java.security.In ...

  5. linux 邮件服务器

    邮件通信系统协议及概念:软件角色:MUA:邮件客户端MTA:邮件服务端MDA:邮件服务端模块邮件客户端:Mail User Agent,邮件用户代理邮件服务端:Mail Transfer Agent, ...

  6. raw文件系统

    简介 RAW文件系统是一个没有被NT文件系统(FAT或NTFS)格式化的磁盘分区(win8默认用的是RAW文件系统). 2定义 分区显示RAW文件系统的直接原因,是由于文件系统不被操作系统识别.此时在 ...

  7. HI3531网络tftp、nfs加载

     ifconfig eth0 hw ether 00:00:23:34:45:66; ifconfig eth0 192.168.1.10 netmask 255.255.255.0; route a ...

  8. [php错误]PHP中Notice: unserialize(): Error at offset of bytes in on line 的解决方法

    使用unserialize函数将数据储存到数据库的时候遇到了这个报错, 后来发现是将gb2312转换成utf-8格式之后, 每个中文的字节数从2个增加到3个之后导致了反序列化的时候判断字符长度出现了问 ...

  9. MySQL显示状态信息

    MySQL显示状态信息 1.show status mysql> show status; +-----------------------------------+----------+ | ...

  10. 初试 Windows XP Embedded 系统开发1

    目前 Windows PE(Preinstallation Environment)和 Windows XP Embedded 是可以脱离主机里的硬盘独立运行的 Windows 操作系统,Window ...