介绍:
在我解释cache管理机制时首先让我阐明下一个观念IE下面的数据管理每个人都会用不同的方法去解决如何在IE在管理数据有的会提到用状态管理有的提到的cache管理这里我比较喜欢cache管理因为本人比较喜cache这个词但是状态管理和cache管理这两个在概念和意义上是不同的下面就让我们来讨论下两都在各个方面的不同之处
虽然cache管理并不存在于Windows程序但在web环境中已经得到巨大的应用自从HTTP变成无协议以来在WEB上要想分辨两个不同请求变得非常难如何分辨如此多的请求变得非常重要如果是同一请求我们就可以把数据缓存起来供web上所有用户访问减少数据重复进行物理加载
提供了几种方法来缓存数据在客户端和服务器端但是我们经常为到底用哪种方式而感动苦恼提供了以下三种实现方式
:Session;: Application : Cache objects我们必须非常清楚它们之间的优势这样才能充分利用它们的优势发挥在web程序中
背景
这篇文章中我将简单涉及cache管理中的不同功能在web程序中我们为了避免因高并发产生的数据访问带来的性能问题我们有必要把数据缓存于服务器端使得后来的访问可以直接调用缓存数据起到数据重用的作用
缓存能够帮忙我们提到服务质量的三个重要方面
性能缓存数据达到数据重用避免了重复的物理数据加载
可量测性数据缓存后减少了从服务器端加载数据
实用性如果其它的系统或者是数据库发生死机那么仍然可以从缓存中取得数据不受局部硬件的影响
在一个web 程序中我们可以数据缓存页面缓存等等让我们来看下数据缓存在服务器端和客户端的不同之处
服务器端缓存:
Session状态管理:
session为每个人缓存数据也就是说这样缓存的数据并不能同时供多人共享限于为单个人缓存数据
状态管理有三种实现方式分别是
:InProc:
它的数据存储在aspnet_wpexe 进程中数据会因为IIS的重启而丢失
:StateServer :
较InProc不同的是它可以存储于不同的服务器中
:SQLServer:
它的数据存储在数据库中数据不会因为IIS的重启而丢失数据
后两种方法与InProc最大的区别在于我们要确保缓存的数据是可序列化的否则只能用于第一种方式为此我们要仔细分析从而选出最适合自己的方式
下面是如何作用Session的代码片段
Code
string empNum = RequestQueryString[empnum];
if (empNum != null)
{
string details = null;
if (Session[EMP_DETAILS] == null)
{
//Get Employee Details for employee number passed
string details = GetEmployeeDetails(ConvertToInt(empNum));
Session[EMP_DETAILS] = details;
}
else
{
details = Session[EMP_DETAILS];
}
//send it to the browser
ResponseWrite(details);
}
ASPNET application
为我们提供了另外一种全局变量保存方法Application对象它也是面向所有用户它的生命周期和应用程序一样当应用程序初始化后它就开始重建但它最大的缺点是没有相关数据过期的方法此时就要用到cache管理
ASPNET cache
cache是我最喜欢用的机制这也是为什么我喜欢说它的原因它提供了键值对应的方法cache对应的命名空间是SystemWebCaching 它的生命周期也依赖于应用程序但它并不像session这也是面向所有用户的虽然cache看起来特别像application但它最大的不同是提供了数据缓存失效控制方法以及数据缓存依赖管理也就是说在cache中我们可以非常容易的按照事先设定好的过期时间来让cache过期删除cache我们也可以根据缓存依赖关系来操作cache当依赖的关系有改动时此时cache也会自动失效而这都是applicaion没法办到的
现在让我们看下中是如何支持cache的过期以及数据缓存依赖的
:缓存依赖
顾名思义它是指当事先设定的依赖关系发生变化时cache 将会失效在中提供了两种依赖关系
文件缓存依赖:当磁盘上的一个文件发生变化时自动让cache失效
下面是实例代码
object errorData;
//Load errorData from errorsxml
CacheDependency fileDependency =
new CacheDependency(ServerMapPath(errorsxml));
CacheInsert(ERROR_INFO errorData fileDependency);
键值缓存依赖看起来和文件缓存非常像不同之外就是这种依赖方式不同而已当有多个cache信息之间互相关联时一个cache信息的变化将会引起其它cache的失效例如一个用户信息包含编号姓名地址等如果用户编号发生变化则cache失效这种情况下用户的基本信息就依赖于用户编号
下面是示例代码
string[] relatedKeys = new string[];
relatedKeys[] = EMP_NUM;
CacheDependency keyDependency = new CacheDependency(null relatedKeys);
Cache[EMP_NUM] = ;
CacheInsert(EMP_NAME Shubhabrata keyDependency);
CacheInsert(EMP_ADDR Bhubaneswar keyDependency);
CacheInsert(EMP_SAL USD keyDependency);
:过期策略从创建cache开始一段时间后自动过期
示例代码
//Absolute Expiration
CacheInsert(EMP_NAME Shubhabrata null
DateTimeNowAddDays() CacheNoSlidingExpiration);
//Sliding Expiration
CacheInsert(EMP_NAME Shubhabrata null
CacheNoAbsoluteExpiration TimeSpanFromSeconds());
ASPNET 页面输出缓存
有的时候在web站点中有些页面在很长一段时间内都不会发生变化例如一个招聘网站它对于工资的描述文字一般不会经常更改一般都是一个月更改一次所以在这一个月内用户看到的内容都是一样的所有如果把数据缓存在服务器端并不是完美的解决方案这里可以用页面输出缓存
下面是示例代码
<%@OutputCache Duration= VaryByParam=empNum
Location=Server%>
:客户端缓存
在上面的文章中我讨论了些数据缓存在服务器端的方法然而有的时候我们为了提高性能我们要把有些数据缓存到客户端利用这种机制来达到缓解服务器压力不过在客户端缓存数据会有各种不同的安全性问题下面我说简要的说下相关内容
Cookies:cookies在WEB程序开发中应用的非常广泛它可以非常方便的在客户端与服务器端相互访问不过它有数据大小限制最大为K所有用它经常是保存小数据同时cookie对于失效的控制也支持的相当完美
下面是示例代码
if (thisRequestCookies[MY_NAME] == null)
{
thisResponseCookiesAdd(new HttpCookie(MY_NAME
Shubhabrata Mohanty));
}
else
{
thisResponseWrite(thisRequestCookies[MY_NAME]Value);
}
ViewState:ViewState是一个全新的概念它一般用于页面或者是控件中保留数据以供和服务端交通在ASP中的我们存储数据是用隐藏控件来完成(Hidden fields)ViewState也是这样用的只不过它比隐藏控件更加安全性所有的值都是经过hash处理的如果你查看页面源代码你都会看到ViewState的存在一般ViewState不用来保存大的数据
下面是示例代码
protected void Page_Load(object sender EventArgs e)
{
if (thisViewState[MY_NAME] == null)
{
thisViewState[MY_NAME] = Shubhabrata Mohanty;
}
//txtName is a TextBox control
thistxtNameText = thisViewState[MY_NAME]ToString();
}
隐藏控件 Hidden fields:它是最简单的不用多说
下面是示例代码
<!In ASPNET>
<asp:HiddenField ID=myHiddenField Value=Shubhabrata
runat=server />
<!In HTML>
<input id=myHiddenField type=hidden value=Shubhabrata />