缓存是大型BS架构网站的性能优化通用手段,之前知道有这个概念,并且也知道很重要,但是一直没静下心来了解。这次借着学习PetShop源码的机会熟悉一下ASP.NET基本的缓存机制(生产环境中的真实缓存有多种实现方式,曾经了解过有MemCache等,这些都不在本篇讨论范围内),主要是3种缓存:1、页面缓存;2、缓存依赖;3、SQL缓存依赖。

先说页面缓存,最简单的使用方式就是在aspx页面顶部(比如在<%@ Page... %>后面)添加<%@ OutputCache Duration="秒数" VaryByParam="none|URL参数" %>,这时在aspx.cs页面中为asp:Label标签的Text属性赋值为当前时间,在Duration秒数时间内,页面的显示时间总是第一次请求页面时间,当缓存时间到期后,再次刷新页面,当前时间就变为新时间了。如果在VaryByParam添加一个参数,比如VaryByParam="id"(多个参数之间用;隔开),这时请求该页面的URL为XXX.aspx?id=1|2|3|...,当id值相同的请求时(比如id都等于1)页面的当前时间值在缓存期内是保持不变的,而在缓存期内更换id值或超出缓存期,再请求页面时,当前时间就变化了。当然页面可以配置的东西都可以在web.config中配置,在system.web节点下,增加caching节点,之下再增加outputCache节点,该节点有一个enableOutputCache属性设为true,另外再在caching节点下增加一个outputCacheSettings节点,在该节点下增加outputCacheProfiles节点,里面增加add节点,这个add节点有属性name,这个一会在页面上要用到,同样设置属性duration、enabled="true"、varyByParam="id"等等好多属性,最后回到页面,将前面引入的配置改为<%@ OutputCache CacheProfile="之前add节点中name属性值" ...%>即可。

下面说一下文件缓存依赖,首先要新建一个文件(htm、html、txt文件应该都可以),然后在测试页面中引入命名空间System.Web和System.Web.Cache,首先设置一个键(字符串类型),开始获取缓存中这个键的值,HttpRuntime.Cache[key],如果获取到了,就把它存到变量timestr中,如果没获取到,则获取最新时间 实例化一个新缓存依赖对象,这里需要把那个文件路径和该文件最后修改时间传入构造函数中,然后在缓存中插入这个键值对,Cache.Insert(key,timestr(value),cd(缓存依赖对象))。这时在这个依赖的文件没有修改时,当前时间总是保持不变,一旦修改并保存这个依赖的文件后,再次刷新页面,当前时间就变为新时间了。

最后说一下SQL缓存依赖,具体看截图:

首先要把需要使用的数据库及数据表的缓存依赖开启,具体是执行aspnet_regsql.exe文件,将数据库MyCacheTest和数据表Students和Teachers开启

其次回到数据库管理器中查看开启操作是否生效,具体看1个数据表加5个存储过程(标红框的部分)

再回到VS中,首先创建3个类库:接口类库ICacheDependency、实现类库TableCacheDependency、工厂类库CacheDependencyFactory,再到web.config文件中,找到刚才的caching节点,在该节点下增加一个sqlCacheDependency,这个节点要有2个属性enabled="true"、pollTime="1000",之下增加databases节点,之下再增加mySqlCache节点,增加name属性和connectionStringName属性,connectionStringName属性的值从根节点下的connectionString节点下的add节点的name属性对应(这里的add节点就是一个数据库连接字符串)。

之后在AppSettings节点要配置3个节点,为了给工厂创建对象使用,其中一个名为dbName的节点,存储的就是sqlCacheDependency节点的名称(如上文所说的mySqlCache);名为 tbStrs的节点存储的是需要sql缓存依赖的数据表名,这里是我们自己的程序读取用,因此值的形式可以自定义,但是注意表名要跟数据库中的数据表名要对应一致,这里测试例子中用到的是Students|Teachers,这是两个表,中间用|分隔开,当然也可以用其他分隔符;还有一个名为Cache的值里面存储的是实现类库的类名,这里测试例子中用的是TableCacheDependency,这个是为了一会工厂类库创建实现类对象是用到的(这个已经用到了依赖导致的概念)。

接着在接口类库中新建一个接口,规范了一个要实现的方法——获取类型为AggregateCacheDependency的对象;实现类库中新建一个实现了接口的类,获取AggregateCacheDependency对象的方法实现细节为,首先从web.config中取出名为dbName和tbStrs的值,用分隔符拆分tbStrs字符串,获取数据表名数组,循环该数组,并通过数据库名(dbName)和数据表数组中的表名实例化SqlCacheDependency对象,然后将该对象添加到AggregateCacheDependency对象中,并返回该对象;在工厂类库中新建两个类,一个是访问类(Access),一个是表现类(Facade),访问类中有一个静态方法,通过读取名为Cache配置项的值,用反射动态加载实现类程序集创建实现类实例,并以接口类型返回对象,而表现类也有一个静态方法,通过调用访问类的静态方法来返回接口类型对象,然后通过这个对象类获取AggregateCacheDependency对象(接口中规范的那个方法)。

在web项目中,通过工厂类库中的表现类获取AggregateCacheDependency对象的方法,返回AggregateCacheDependency实例,并在Page的Cache属性对象调用Insert方法,传入键、值和AggregateCacheDependency对象,在调用方法之前要先从对应的键中取值,只有当取到的值为空或null时才重新获取值并调用Insert方法。

实际使用页面时,当执行显示当前时间时,第一次会显示当前最新时间,之后时间就保持不变。如果这时手动修改数据库中的数据表,比如插入一条记录,再执行显示当前时间时,会发现会更新显示当前最新时间。

最后,实际PetShop中用到的缓存机制,会很复杂,但是总体思想跟这个简化版的是一样的。

学习ASP.NET缓存机制的更多相关文章

  1. 概述ASP.NET缓存机制

    PetShop之ASP.NET缓存机制 如果对微型计算机硬件系统有足够的了解,那么我们对于Cache这个名词一定是耳熟能详的.在CPU以及主板的芯片中,都引入了这种名为高速缓冲存储器(Cache)的技 ...

  2. 定义 ICache 接口,以及实现默认的 ASP.NET 缓存机制

    本文定义 ICache 接口,以及实现默认的 ASP.NET 缓存机制(即通过 System.Web.Caching.Cache)来缓存,将来也可以通过扩展,替换默认实现. 下面直接贴代码了: ICa ...

  3. 详解ASP.NET缓存机制

    文中对ASP.NET的缓存机制进行了简述,ASP.NET中的缓存极大的简化了开发人员的使用,如果使用得当,程序性能会有客观的提升.缓存是在内存存储数据的一项技术,也是ASP.NET中提供的重要特性之一 ...

  4. Android学习——ListView的缓存机制

    在使用ListView的时候,需要加载适配器和数据源,这篇文章主要介绍一下ListView的使用以及利用ListView的缓存机制来减少系统的初始化时间. ListView的使用 ListView和V ...

  5. (五)JS学习笔记 - JQuery缓存机制

    历史背景 开发中常常因为方便,把状态标志都写到dom节点中,也就是HTMLElement,缺点: 循环引用 直接暴露数据,安全性? 增加一堆的自定义属性标签,对浏览器来说是没意义的 取数据的时候要对H ...

  6. JPA,EclipseLink 缓存机制学习(一) 树节点搜索问题引发的思考

    最近在项目在使用JPA+EclipseLink 的方式进行开发,其中EclipseLink使用版本为2.5.1.遇到一些缓存方面使用不当造成的问题,从本篇开始逐步学习EclipseLink的缓存机制. ...

  7. JPA,EclipseLink 缓存机制学习——树节点搜索问题引发的思考

    最近在项目在使用JPA+EclipseLink 的方式进行开发,其中EclipseLink使用版本为2.5.1.遇到一些缓存方面使用不当造成的问题,从本篇开始逐步学习EclipseLink的缓存机制. ...

  8. C#无限极分类树-创建-排序-读取 用Asp.Net Core+EF实现之方法二:加入缓存机制

    在上一篇文章中我用递归方法实现了管理菜单,在上一节我也提到要考虑用缓存,也算是学习一下.Net Core的缓存机制. 关于.Net Core的缓存,官方有三种实现: 1.In Memory Cachi ...

  9. ASP.NET运行机制原理 ---浏览器与IIS的交互过程 自己学习 网上查了下别人写的总结的很好 就转过来了 和自己写的还好里嘻嘻

    一.浏览器和服务器的交互原理 (一).浏览器和服务器交互的简单描述: 1.通俗描述:我们平时通过浏览器来访问网站,其实就相当于你通过浏览器去访问一台电脑上访问文件一样,只不过浏览器的访问请求是由被访问 ...

随机推荐

  1. Android客户端的图形化拖放操作的设计实现

    为什么要拖放?拖放在某些UI交互中可以简化用户操作. 拖放的步骤包括哪些?“Drag and Drop”,拖放,顾名思义,总共就分三步:1, 开始拖起来:2, 正在拖:3, 放下,进行操作:在这三步里 ...

  2. 读书笔记-Android初学笔记

    Eclipse [ADT] 源 https://dl-ssl.google.com/android/eclipse Notice that no matter what scenario causes ...

  3. bootstrap按钮组

    种类 -a,   input ,   button 块级 btn-block 按钮组 btn-group btn-group-justified btn-group-vertical </div ...

  4. 利用php的register_shutdown_function来记录php的输出日志

    最近在做的一个项目..由于全是通过远程http请求来调用php的接口程序.. 接收到的参数和返回的内容对开发人员来说都是未知不可见的.. 虽然可以通过直接在脚本中模拟请求..但由于实际环境复杂的多.. ...

  5. 阿里云ecs云服务器安装wdcp控制面板教程

    以前就听说服务器非常的难,而且我也不懂代码,不懂英文,我怕自己学不会就买了一个月的.开始我都不知道啥样的服务器,还是我的一位哥们给我远程买的,他说这个镜像最稳定了. 服务器买好后我便开始研究,可是怎么 ...

  6. 【GoLang】GoLang 错误处理 -- 使用 error is value 的思路处理,检查并处理error

    吐血推荐: https://dave.cheney.net/2016/04/27/dont-just-check-errors-handle-them-gracefully 参考资料: https:/ ...

  7. Buzz words

    给你一个字符串和字典,从头扫到位,如果到当前的字符的字符串存在于字典中,则显示 buzz. 例子: ILOVEPINEAPPLEJUICE 字典: [pine, apple, pineapple, j ...

  8. solr单机环境配置并包含外部单机zookeeper

    首先和之前一样下载solr-5.3.1.tgz,然后执行下面命令释放文件并放置在/usr/目录下: $ .tgz $ /usr/ $ cd /usr/solr- 这个时候先不用启动solr,因为单机模 ...

  9. ACM/ICPC 之 并查集-食物链(POJ1182)

    并查集的经典题型,POJ上题目还是中文= =,一般看到中文题都会感觉不太简单,这道题的数学归纳用得比较多,可以简化代码,挺有意思的. 同类型的题目还有POJ1703,比这个要简单,想了解并查集基本介绍 ...

  10. 20. javacript高级程序设计-JSON

    1. JSON JSON是一种数据格式,存在以下三种类型的值: l 简单值:使用与JavaScript相同的语法,可以在JSON中表示字符串.数值.布尔值和null,不支持 undefined,例如: ...