一缓存概念缓存的好处类型
缓存是一种用空间换取时间的技术通俗点也就是说把你得到的数据存放在内存中一段时间在这短时间内服务器不去读取数据库或是真实的数据源而是读取你存放在内存中的数据这里你会疑惑怎么设置存放数据能存放什么样子的数据存放时间的设置真实数据源数据改变服务器不就读取存在偏差?别急下面慢慢会说到的……
缓存的好处缓存是网站性能优化不可缺少的一种数据处理机制他能有效的缓解数据库压力例如网站每分钟的点击率为万如果不使用缓存的静态页面这里也没有viewstate的情况下(viewstate会产生大量的字符串对服务器交互数据是一种压力所以一般页面是要禁用viewstate采用缓存的)只能是用户点击一次该页面这个页面就读取一次数据库这样给数据库造成的压力可想而知如果这里我们使用了缓存的话设置缓存有效期为分钟则这一分钟只内点击万次跟点击一次是一样的都是读取一次数据库数据源是被缓存在内存中了
中的缓存主要分为页面缓存数据源缓存自定义数据缓存这三种主要类型
二数据缓存
[csharp]
public partial class WebForm : SystemWebUIPage
{
protected void Page_Load(object sender EventArgs e)
{
// Cache[date]=要缓存的数据 这里是自定义缓存的简单声明使用
string datastr = DateTimeNowToLongTimeString()
ResponseWrite(第一个输出时间+datastr+</br>) //这里读取的当前的时间刷新页面时这里的时间会随着变化
if (Cache[date] == null) //判断是否存在value值为date的缓存是否存在
{
Cache[date] = datastr;
ResponseWrite(第二个输出时间为+Cache[date] + 这里读取的当前的时间) //这里读取的当前的时间刷新页面时这里的时间会随着变化
}
else
{
ResponseWrite(Cache[date] + 这里是从缓存中读取的时间)//这里读取的缓存中的时间刷新页面时这里的随着时间变化不会变化
}
}
}
上面数据缓存由于没有设置缓存的过期时间所以第一个输出时间为当前时间(刷新页面会变)第二个输出时间会一直为第一次存入缓存的时间(刷新页面不变)
下面我们给数据缓存添加一些实用的参数(上代码)
[csharp]
protected void Page_Load(object sender EventArgs e)
{
string ids=;
MaticsoftBLLScriptsBak bll = new MaticsoftBLLScriptsBak()
List<MaticsoftModelScriptsBak> list = new List<MaticsoftModelScriptsBak>()
list = bllGetAll()
for (int i = ; i < listCount; i++)
{
ids += list[i]ScriptIdToString()+;
}
ids = ids + 完; //这里的ids为从数据库中读取表中的id值然后用链接起来的一个字符串
if (Cache[key] == null)
{
CacheInsert(key ids null DateTimeNowAddSeconds() SystemWebCachingCacheNoSlidingExpiration) //这里给数据加缓存设置缓存时间
//key为缓存的键ids为缓存起来的值null为缓存依赖项这里没有使用缓存依赖项所以为null下面会详细介绍缓存依赖项
//null后面为缓存的时间为秒
//最后一个参数为设置时间的格式ASPNET允许你设置一个绝对过期时间或滑动过期时间但不能同时使用
//我们这里设置的为绝对过期时间也就是没刷新一次页面后缓存数据为秒秒后会从数据库中重新获取
ResponseWrite(cache加载为 + Cache[key] + </br>)
}
else
{
ResponseWrite(cache加载为 + Cache[key] + </br>)
}
ResponseWrite(直接加载为 + ids + </br>)
}
数据缓存将一些耗费时间的条目加入到一个对象缓存集合中以键值的方式存储我们可以通过使用CacheInsert()方法来设置缓存的过期优先级依赖项等
三页面缓存
[csharp]
protected void Page_Load(object sender EventArgs e)
{
string date = DateTimeNowToString()
ResponseWrite(date)
}
[csharp]
<%@ Page Language=C# AutoEventWireup=true CodeBehind=WebFormaspxcs Inherits=cacheWebForm %>
<%@ OutputCache Duration= VaryByParam=none %>
<!添加上这一句代码意思是添加此页面缓存十秒这十秒之内刷新页面将读缓存起来页面的值不再执行Page_Load方法
Page_Load方法是每十秒执行一次>
<!DOCTYPE html PUBLIC //WC//DTD XHTML Transitional//EN /TR/xhtml/DTD/xhtmltransitionaldtd>
<html xmlns=//xhtml>
<head runat=server>
<title></title>
</head>
<body>
<div>
</div>
</body>
</html>
<%@ OutputCache Duration= VaryByParam=none %> 这条指令标签为该页面添加缓存Duration这个参数指定页面缓存时间为秒VaryByParam这个指定页面参数也就是这样子的打个比方例如这样一个页面/knowledgesea/admin/EditPostsaspx?postid=&update=那么他的参数也就是postid和update如果这样页面我们可以把指令标签写为<%@ OutputCache Duration= VaryByParam=postid;update %> 参数与参数之间用分号隔开这样子也就吧每个单独的页面缓存起来了他缓存的就是postid=&update=或者postid=&update=等等不一样的参数页面全部缓存起来这里可以使用一个简便的方法就是<%@ OutputCache Duration= VaryByParam=* %>缓存起来所有当前的页面下参数不一样的页面
ASPNET不会再执行页面的生命周期和相关代码而是直接使用缓存的页面简单点理解也就是我注释中介绍的
四控件缓存
ObjectDataSource这样的数据源控件可以在属性栏中找到相应的属性进行设置下面我列出个例子设置启动缓存缓存时间为秒时间类型为绝对时间
<asp:ObjectDataSource ID=ObjectDataSource runat=server EnableCaching=True CacheDuration= CacheExpirationPolicy=Absolute></asp:ObjectDataSource>
没有缓存属性的控件要加缓存
[csharp]
protected void Page_Load(object sender EventArgs e)
{
string date = DateTimeNowToString()
TextBoxText = date;
}
[csharp]
<%@ Page Language=C# AutoEventWireup=true CodeBehind=WebFormaspxcs Inherits=cacheWebForm %>
<%@ OutputCache Duration= VaryByControl=TextBox%>
<!VaryByControl的参数为要缓存的控件id>
<!DOCTYPE html PUBLIC //WC//DTD XHTML Transitional//EN /TR/xhtml/DTD/xhtmltransitionaldtd>
<html xmlns=//xhtml>
<head runat=server>
<title></title>
</head>
<body>
<form id=form runat=server>
<div>
<asp:TextBox ID=TextBox runat=server></asp:TextBox>
</div>
</form>
</body>
</html>
这里的TextBox控件就加了缓存这里的缓存时间为秒也就是秒内ASPNET不会再执行页面的生命周期和相关代码而是直接使用缓存的页面
五缓存依赖
[csharp]
protected void Page_Load(object sender EventArgs e)
{
string str = ;
if (Cache[key] == null)
{
str = SystemIOFileReadAllText(ServerMapPath(TextFiletxt)) //读取TextFiletxt文件中的数据
CacheDependency dp = new CacheDependency(ServerMapPath(TextFiletxt))//建立缓存依赖项dp
CacheInsert(key str dp)
ResponseWrite(Cache[key]) //如果TextFiletxt这个文件的内容不变就一直读取缓存中的数据一旦TextFiletxt文件中的数据改变里面重新读取TextFiletxt文件中的数据
}
else
{
ResponseWrite(Cache[key])
}
}
缓存依赖项使缓存依赖于其他资源当依赖项更改时缓存条目项将自动从缓存中移除缓存依赖项可以是应用程序的 Cache 中的文件目录或与其他对象的键如果文件或目录更改缓存就会过期
六配置文件中设置缓存
[csharp]
<systemweb>
<caching>
<outputCacheSettings>
<outputCacheProfiles>
<addname=ProductItemCacheProfile duration=/>
</outputCacheProfiles>
</outputCacheSettings>
</caching>
</systemweb>
[csharp]
<%@ Page Language=C# AutoEventWireup=true CodeBehind=WebFormaspxcs Inherits=cacheWebForm %>
<%@ OutputCache CacheProfile=ProductItemCacheProfile VaryByParam=none %>
<!这里的CacheProfile参数与配置文件中的保持一至>
<!DOCTYPE html PUBLIC //WC//DTD XHTML Transitional//EN transitionaldtd>
<html xmlns=>
<head runat=server>
<title></title>
</head>
<body>
<div>
</div>
</body>
</html>
这样就给页面添加了缓存为秒的页面
七缓存的回调函数
[csharp]
protected void Page_Load(object sender EventArgs e)
{
string str = ;
if (Cache[key] == null)
{
str = SystemIOFileReadAllText(ServerMapPath(TextFiletxt)) //读取TextFiletxt文件中的数据
CacheDependency dp = new CacheDependency(ServerMapPath(TextFiletxt))//建立缓存依赖项dp
CacheInsert(key str dp DateTimeNowAddSeconds() CacheNoSlidingExpiration CacheItemPriorityLow CacheItemRemovedCallback)
//CacheItemPriority这个参数为缓存的优先级他分好多种级别为了防止缓存占满时系统自己删除缓存的优先顺序废除缓存的后面的为回调函数的名称
ResponseWrite(Cache[key]) //如果TextFiletxt这个文件的内容不变就一直读取缓存中的数据一旦TextFiletxt文件中的数据改变里面重新读取TextFiletxt文件中的数据
}
else
{
ResponseWrite(Cache[key])
}
}
public void CacheItemRemovedCallback(string key object value CacheItemRemovedReason reason) //这个为缓存移除时的回调函数一定要保持与 CacheInsert()方法中的最后一个参数名字一致
//这里使用了委托你可以在 CacheInsert()这个函数中转定义看到的所以这里的格式就只能按我写的这种方法签名写
{
SystemIOFileWriteAllText(ServerMapPath(logtxt)缓存移除原因为+reasonToString())
}