C#.Net环境下的缓存技术

时间:2022-03-12 06:18:12

一、缓存技术
本节将介绍以下技术:

使用Asp.Net缓存;

使用Remoting Singleton缓存;

使用内存映射文件;

使用SQL Server缓存;

使用静态变量缓存;

使用Asp.net 会话状态(Session State);

使用Asp.net客户端缓存和状态;

使用Internet Explorer缓存。

2.1 Asp.net缓存
将常用的数据生存在内存中对asp的开发人员来说并不陌生,Session东西和Application东西供给键值对来缓存数据,Session东西生存和单个用户有关的数据,Application东西可保存和应用措施有关的数据,每个用户都可以访谒。

在Asp.net中,供给了专门用于缓存数据的Cache东西,它的应用范畴是应用措施域。保留期是和应用措施紧密相关的,每当应用措施启动的时候就从头创建Cache东西。它域Application东西的主要区别就是供给了专门用于缓存打点的特性,好比依赖和过期计谋。

你可以使用Cache东西和它的属性来实现高级的缓存成果,同时可以操作Asp.net Cache来对客户端输出的响应内容进行缓存。关于Asp.net中的缓存技术,有以下内容要介绍:

2.1.1  编程缓存Programmatic Caching
Cache东西界说在System.Web.Caching定名空间,可以使用HttpContext类的Cache属性或Page东西的Cache属性来得到Cache的引用,Cache东西除了存储键值对以外,还可以存储.net框架的东西。下面介绍相应的依赖和过期计谋。

2.1.1.1 依赖和过期计谋
当向缓存中加数据时,可以指定它的依赖关系来实此刻某些情况下强制移除它。可用的方案包孕以下几种:

·文件依赖(File Dependency)——当硬盘上的某个(某些)文件变动时,强制移除缓存数据;如:

C#.Net环境下的缓存技术

·键值依赖(Key Dependency)——指定缓存中的某个数据项变动时移除。如:

 

·基于时间的过期计谋——凭据预先界说的时间计谋来使数据掉效,可以是绝对时间(如某个日期的18:00)也可以是相对此刻的相对时间。如:


使用太短和太长的过期时间都不行,不是造成用不上的缓存数据,就是缓存了古老的数据并加重了缓存承担,,所以可以使用高并发的测试来决定过期时间的最佳值。

·此外有个问题就是如何实现对数据库的依赖,这就要求实现本身的通知机制,当数据库数据转变时能够通知你的缓存数据转变。

由于数据会过期,所以当使用缓存中的数据时,必需查抄数据的有效性。如以下代码:


依赖和过期计谋指定了缓存中数据的移除方法,有时候你可能需要在移除产生时做一些事情,这能靠写代码来实现这一点,这就是我们要讲到的。

2.1.1.2 使用缓存回调(Cache Callback)
你可以界说回调,这样当移除自动产生时, 你可以不移除它或者使用新的数据来替换它。如:




2.1.1.3 对缓存项使用优先级

当运行应用措施的处事器内存不敷时,会自动断根缓存中的数据,称为“断根scavenging”。此时,Cache东西按照缓存项的优先级来决定先移除哪些缓存数据,你可以在代码中指定缓存项的优先级。参看MSDN中“CacheItemPriority 枚举”,如:

Cache.Insert("DSN", connectionString, null, d, t, CacheItemPriority.High, onRemove);

2.1.1.4 刷新数据(断根缓存)
没有直接的要领来刷新Asp.net的输出缓存,但是有替代要领(设置所有数据掉效),好比:

Response.Cache.SetExpires(DateTime.Now)

这可以断根缓存,但页面上并不立刻浮现出来,直到最初的缓存期结束,好比:

指令指定的缓存只会在10秒后才断根。凡是并不需要断根所有缓存项,你只要从头加载数据更新缓存就够了。

2.1.2  输出缓存(Output Cache)
你可以使用两种方法的输出缓存来缓存需要传输和显示到客户端浏览器上的数据——页面输出缓存(Page Output Cache)和页面片断缓存(Page Fragment Cache)。当整个页面相对变革较少时,可以缓存整个页面;如果只是页面的一部分经常变革,可以使用片断缓存。

2.1.2.1 页面输出缓存
Page Output Caching将对页面请求的响应放入缓存中,后续对此页面的请求将直接从缓存中得到信息而不是重建此页面。可以通过添加Page指令(高级别,声明实现)来实现,也可以使用HTTPCachePolicy类来实现(初级别,措施实现)。本指南不筹算介绍技术细节,只给出如何更好使用的指南和最佳实践。有四方面的内容:

1、决定缓存的内容

页面输出缓存可缓存各类信息,缓存这些信息意味着你不需要经常措置惩罚惩罚同样的数据和功效,包孕:

·经常被请求但不不转变的静态页面;

·更新频率和时间已知的页面(如显示股票价格的页面);

·按照HTTP参数,有几个可能输出的页面(如按照都市的代号显示该都市天气情况的页面);

·从Web Service返回的功效;如:

2、缓存动态页面

基于输入参数、语言和浏览器类型转变的动态网页经常用到。你可以使用OutputCache的以部属性来实现对动态页面的缓存:

VaryByParam——基于输入参数差别缓存同一页面的多个版本;

VaryByHeader——基于Page Header的内容差别缓存页面的多个版本;

VaryByCustom——通过声明属性和重载GetVaryByCustomString要领来定制缓存措置惩罚惩罚页面的多个版本;

VaryByControl——基于控件中asp东西属性的差别来缓存控件。

对多个版本页面的缓存会降低可用内存,所以要仔细衡量缓存计谋。s

3、控制缓存的位置

你可以使用@OutputCache指令的OutputCacheLocation属性的枚举值来指定缓存的位置,如:

4、 配置页面输出缓存

有两种方法控制,你可以使用Page指令,也可以使用Cache API编程实现。参考以下两段代码:



2.1.2.2 页面片断缓存
有时候缓存整个页面并不灵活,同时内存的发但也对照大,这时候应考虑片断缓存。页面片断缓存适合以下类型的数据:

·创建开销很大的页面片断(控件);

·包罗静态数据的页面片断;

·可被多个用户使用的页面片断;

·多个页面共享的页面片断(如公用菜单条)

以下是缓存部分页面的例子: