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 ...
随机推荐
- Android动态加载技术(插件化技术)
No1: 插件化技术的好处: 1)减轻应用的内存和CPU占用 2)实现热插拔,即在不发布新版本的情况下更新某些模块 No2: 插件化方案必须要解决三个基础性问题:资源访问.Activity生命周期的管 ...
- Python 关于super 的 用法和原理(挖坑)
一.前言 Python 面向对象中有继承这个概念,初学时感觉很牛逼,里面也有个super类,经常见到,最近做一些题才算是理解了.特地记录分享给后来研究的小伙伴,毕竟现在小学生都开始学了(滑稽脸) 二. ...
- JQ小随笔
JQ select的val 会自动选择option的val layer 弹窗插件 Validation-Engine验证插件
- Hbase的存储
Hbase在生态系统中的位置 Hbase存储的逻辑视图 Hbase的存储格式 Hbase写数据流程 Hbase快速响应数据 Hbase在生态系统中的位置 HBase位于结构化存储层,Hadoop HD ...
- Ubuntu上搭建Hadoop环境(单机模式+伪分布模式)
首先要了解一下Hadoop的运行模式: 单机模式(standalone) 单机模式是Hadoop的默认模式.当首次解压Hadoop的源码包时,Hadoop无法了解硬件安装环境,便保守地选 ...
- linux及hadoop修改权限
linux下修改文件权限: 在shell环境里输入:ls -l 或者 ls -lh drwxr-xr-x 2 nsf users 1024 12-10 17:37 下载文件备份对应:文件属性 连接数 ...
- vxWorks BSP主要文件目录的组成及主要文件的作用
vxWorks BSP主要文件目录的组成及主要文件的作用 1.目录target/config/All: 这个目录下的文件是所有BSP文件共享的,不是特别需要不要更改里面的任何文件. a.configA ...
- STM32 下的库函数和寄存器操作比较
以 led闪烁中的flashLed函数例子: 库函数操作简单,但是效率不如寄存器操作的高: 寄存器操作很复杂,因为要熟悉上百个寄存器,但是程序效率很高 /**下面是通过直接操作库函数的方式实现IO控制 ...
- C#抽象类应用实例
abstract修饰符可以和类.方法.属性.索引器及事件一起使用,在类声明中使用abstract修饰符以表明这个类只能是其他类的基类. 抽象类的特性 (1)抽象类不能被实例化 (2)抽象类可以包含抽象 ...
- 【原】Java学习笔记026 - 集合
package cn.temptation; public class Sample01 { public static void main(String[] args) { // 需求:从三国演义中 ...