ASP.NET--CACHE缓存
ASP.NET中提供了两种缓存更新策略:
1.被动更新。缓存过期以后手动进行更新
2.主动更新。缓存过期以后在回调方法中更新
如果我们现在要缓存一个数据集:DataSet ds=getData();//getdata()是一个自定义方法,从数据库获取数据
A.插入永不过期的缓存:Cache.Insert("data",ds);
B.插入绝对时间过期缓存:Cache.Insert("data",ds,null,DateTime.now.AddSeconds(10),TimeSpan.Zero);
C.插入变化时间过期缓存:Cache.Insert("data",ds,null,DateTime.Maxvalue,TimeSpan.FromSeconds(10));
总结这三种缓存过期策略:
A:永不过期:直接复制缓存的key 和value即可
B:绝对时间过期:DateTime.Now.AddSeconds(10)表示缓存在10秒后过期,TimeSpan.Zero表示不使用平滑过期策略。
C:变化时间过期(平滑过期):DateTime.MaxValue表示不使用绝对时间过期策略,TimeSpan.FromSeconds(10)表示缓存连续10秒没有访问就过期。
Add()方法也可在cache中添加缓存,但它只能添加缓存中没有的项,如果存在将添加失败(但不会抛出异常),Insert()方法将覆盖原来的项。
另外还有一个依赖过期策略,即缓存中的依赖项(比如一个文件)的内容改变之后缓存也就失效了。例如 建立一个缓存依赖项:
CacheDependency cd = new CacheDependency(Server.MapPath("test.txt"));
DataSet ds = GetData();
Cache.Insert("Data", ds, cd); 这就添加了一个一个依赖于 test.txt文件的缓存过期策略。
cache缓存的更新策略
在Web程序中我们通常会使用被动更新。所谓被动更新,就是在调用数据的时候判断缓存是否为空,如果为空则先更新缓存然后再从缓存中读取数据,如果不为空则直接从缓存中读取数据。
可以利用缓存的回调功能让缓存过期后自动续建实现自动更新的目的。
DataSet ds = GetData();
Cache.Insert("Data", ds, null, DateTime.Now.AddSeconds(10), TimeSpan.Zero,
CacheItemPriority.Default, CacheRemovedCallback);
最后一个参数表明缓存被移除以后自动调用CacheRemovedCallback()方法。
手动移除某个缓存的方法:
Cache.Remove("Data");
如果要移除所有缓存只能通过遍历来实现:
IDictionaryEnumerator CacheEnum = HttpRuntime.Cache.GetEnumerator();
while (CacheEnum.MoveNext())
{
Cache.Remove(CacheEnum.Key.ToString());
}
cache总结
· 存储的物理位置。服务器内存。
· 存储的类型限制。任意类型。
· 状态使用的范围。当前请求上下文,所有用户共用一份。
· 存储的大小限制。任意大小。
· 生命周期。有多种过期策略控制缓存的销毁。
· 安全与性能。数据总是存储在服务端,安全性比较高,但不易存储过多数据。
· 优缺点与注意事项。检索数据速度快,过期策略丰富。注意别把对实时性要求很高的数据放到Cache中,不断更新Cache会对数据库造成压力。
主要有两种类型的缓存:
1.输出缓存Output caching
2.数据缓存Data caching
上面主要说的是数据缓存,下面说下输出缓存
1. 输出缓存(Output Caching)
使用输出缓存,你可以缓存最后输出的HTML页面,当相同的页面再次请求的时候,ASP.NET不会再执行页面的生命周期和相关代码而是直接使用缓存的页面,语法如下:<%@ OutputCache Duration=”60” VaryByParam=”None” %>
如果你的页面是通过查询字符串来获取信息的,你可以根据查询字符串很容易的缓存页面的不同拷贝。 VarByParam=”None”指定ASP.NET只存储缓存页面的一个拷贝。VarByParam=”*” 指定ASP.NET根据不同的查询字符串存储不同的缓存页面。
<%@ OutputCache Duration="60" VaryByParam="*" %>
<div align="right">
<a href="OutputCachingTest2.aspx" mce_href="OutputCachingTest2.aspx">No Query String</a> |
<a href="OutputCachingTest2.aspx?id=1" mce_href="OutputCachingTest2.aspx?id=1">ID 1</a> |
<a href="OutputCachingTest2.aspx?id=2" mce_href="OutputCachingTest2.aspx?id=2">ID 2</a> |
<a href="OutputCachingTest2.aspx?id=3" mce_href="OutputCachingTest2.aspx?id=3">ID 3</a> |
<a href="OutputCachingTest2.aspx?id=3&langid=1" mce_href="OutputCachingTest2.aspx?id=3&langid=1">ID 3</a>
</div>