asp.net

位置:IT落伍者 >> asp.net >> 浏览文章

ASP.NET缓存初探 使用得当是关键


发布日期:2021年01月08日
 
ASP.NET缓存初探 使用得当是关键

文中对ASPNET的缓存机制进行了简述ASPNET中的缓存极大的简化了开发人员的使用如果使用得当程序性能会有客观的提升

缓存是在内存存储数据的一项技术也是ASPNET中提供的重要特性之一对于程序员来讲了解ASPNET缓存的工作原理对于其设计程序是非常有用的

ASPNET需要被缓存的对象多种多样包括从数据库中提取出来的数据以及aspx页面生成的静态页甚至是编译好的程序集合理利用缓存能让ASPNET的性能大幅提升下面将对ASPNET中的缓存机制进行简单概述

缓存的分类

在ASPNET中大部分缓存机制是保存在cache对象中也就是服务器内存的一部分当用户请求数据时如果数据已经被缓存则用户所提取的数据直接从服务端返回而不是从数据库等底层数据库提取这对性能的提升不得不说很有帮助下面来看ASPNET中几种缓存机制

程序集缓存

简单的说这种缓存是ASPNET自带的无需开发人员进行参与的缓存方式即当第一次请求服务器时Page类以及相关程序集被编译当下次请求时访问缓存后的编译而不是重新编译CLR会自动检测代码的改变如果代码改变后当下次访问时相关代码会被重新编译

数据源缓存

数据源缓存顾名思义也就是利用数据源控件对获取的数据进行缓存的方式这些控件包括SqlDataSourceObjectDataSource等作为抽象类的DataSourceControl暴漏了如下属性用于缓存

)thisstylewidth=; border=>

CacheDuration获取或设置以秒为单位的一段时间数据源控件就在这段时间内缓存 SelectMethod 属性检索到的数据CacheExpirationPolicy获取或设置缓存的到期行为该行为与持续时间组合在一起可以描述数据源控件所用缓存的行为CacheKeyDependency获取或设置一个用户定义的键依赖项该键依赖项链接到数据源控件创建的所有数据缓存对象EnableCaching 获取或设置一个值该值指示 ObjectDataSource 控件是否启用数据缓存

而使用起来就非常简单了只需要将缓存的相关属性进行设置即可比如我想要当前数据源缓存只需要设置EnableCaching属性和CacheDuration属性如下这种方式的工作原理可以用下图表示

image onmousewheel=javascript:return big(this)  height= alt= hspace= src=http://imgeducitycn/img_///jpg width= onload=javascript:if(thiswidth>)thisstylewidth=; border=>

SQL Cache Dependency

大家应该注意到了上面的数据源控件还暴漏了CacheKeyDependency属性这是用于实现SQL Cache Dependency的方式关于Dependency其实就是在数据库表内容改变时将相应的缓存进行更新正如Dependency这个词的意思一样是缓存依赖底层数据库下面就要说到两种实现SQL Cache Dependency的方法了

方法一使用轮流查询机制(pollingbased)

这种方式实现机制是在sql server中插入以AspNet_SqlCacheNotification_Trigger开头的一个特殊的表和个存储过程当被监测的表数据发生改变时则一个名为AspNet_SqlCacheTablesForChangeNotification的表被更新而ASPNET程序会根据用户设置的间隔时间每隔一定时间检查一下数据库内容是否更新如果更新则将缓存中的数据进行跟新

使用起来就很简单了可以在页面头部的OutputCache指令中设置会社DataSource空间中进行设置设置格式为数据库名表名里面的表名即是需要监测是否改变的表名示例如下

<%@ OutputCache Duration= VaryByParam=none SqlDependency=DatabaseName:tableName %> 如果需要添加多个表则用;进行分割

SqlDependency=database:table;database:table 方法二使用通知机制(notificationbased)

使用通知机制配置起来要简便很多但是sql server的版本需要以上也就是sql server 使用这种方式需要将sql server的通知服务开启使用通知机制可以对页面进行缓存也可以对datasouce控件进行缓存对页面进行缓存代码如下

<%@ OutputCache Duration= VaryByParam=none SqlDependency=CommandNotification %> 注意SqlDependency必须设置成CommandNotification对于datasource控件也是同样

<asp:SqlDataSource ID=SqlDataSource runat=server ConnectionString=<%$ ConnectionStrings:AdventureWorksConnectionString %> SelectCommand=SELECT top * FROM [Person][Contact] EnableCaching=true CacheDuration= SqlCacheDependency=CommandNotification></asp:SqlDataSource> 输出缓存(output Caching)

输出缓存是页面级别的缓存是将aspx页面内容在第一次请求后生成的静态页放入缓存在不过期时间内每一次请求时从缓存中返回静态页而不是重新走完ASPNET的生命周期可以将可以通过在页面头部加入OutputCache指令实现也可以通过HttpCachePolicy类实现输出缓存可以缓存整个页面也可以缓存部分页面缓存页面的一部分是通过用户控件来实现下面来看通过OutputCache指令实现页面缓存前面已经看到这种方式十分简单下面说一下OutputCache的重点属性

Duration

页面过期的时间单位为秒超过过期时间后则在下一次请求时页面会重新生成并缓存

VaryByHeader VaryByCustom VaryByParam VaryByControl VaryByContentEncodings 这些属性都是为了保存页面的多个版本比如说一个页面用于显示产品则根据产品id的不同缓存同一个页面的不同版本

CacheProfile

这个选项有些像连接字符串作用只是将具体的缓存选项变成对于选项的引用比如我们在WebConfig放入如下代码

<caching>

<outputCacheSettings>

<outputCacheProfiles>

<add name=CacheProfile

enabled=true

duration=

varyByParam=product:id/>

</outputCacheProfiles>

</outputCacheSettings>

</caching>

则在引用时只需要在页面头部设置如下:

<%@ OutputCache CacheProfile=CacheProfile %> DiskCacheable

因为服务器内存是有限的所以通过将DiskCacheable属性设置为true则可以将缓存页面放入硬盘中这样即使服务器崩溃重启缓存依然存在

缓存部分页面

缓存页面的一部分实现原理和缓存整个页面毫无二致都是在页面头部加入OutputCache指令唯一的不同是缓存部分页面是在用户控件中进行的这部分就不在多说了

使用HttpCachePolicy缓存页面

前面已经说了通过OutputCache指令在页面头部设置缓存选项另一种替代方法是使用HttpCachePolicy类这个类的实例是ResponseCache如果使用HttpCachePolicy设置缓存则需要在页面移除OutputCache指令比如:

<%@ OutputCache Duration= VaryByParam=state;city %> 和下面代码是等价的

ResponseCacheSetExpires(DateTimeNowAddSeconds());

ResponseCacheVaryByParams[state] = true;

ResponseCacheVaryByParams[city] = true;

对象缓存

对象缓存是将继承与SystemObject的对象缓存在服务器的内存中通过Page类的Cache属性可以访问到Cache集合Cache内可以放任何类型的对象但是要小心使用Cache因为Cache是占用服务器内存如果使用不当也许会拖累性能使用Cache的例子

//save object into Cache Cache[table] = GridView;

//get object from Cache

GridView gv = (GridView)Cache[table];

要注意的是再提取缓存中的对象时一定别忘了强制转换

               

上一篇:浅谈ASP.NET MVC Membership权限机制

下一篇:asp.net 回车自动登陆设置