小谈.NET下的缓存。
缓存
状态管理可以分为服务端状态管理和客户端状态管理
服务端状态管理就是信息保存在服务器,当IIS重启是信息会丢失
客户端状态管理就是将信息保存在客户端,
Session ,Application HttpContexth和Cache属于服务端的状态,
QueryString ,ViewState ,ControlState,Cookie和隐藏域属于客户端状态,
客户端状态不如服务端可靠和安全性高,但是服务端会占用服务端的资源,影响服务器的性能
下面是各个状态的对比:
状态 |
适用对象 |
生命周期 |
数据范围 |
Session |
单个用户 |
Session超期之前 |
数据大小不限,建议数据尽量少 |
Application |
所有用户 |
在应用程序终止之前 |
数据大小不限 |
HttpContext |
单个用户 |
一个请求期间 |
数据大小不限,建议数据尽量少 |
Cache |
所有用户 |
可编程控制 |
数据大小不限 |
Cookie |
单个用户 |
可编程控制 |
数据受限Cookie大小限制 |
QueryString |
单个用户 |
下一个请求可编程控制 |
受URL长度限制 |
隐藏域 |
单个用户 |
下一个请求可编程控制 |
数据大小受表单提交的大小限制 |
ViewState |
单个用户 |
一个页面范围 |
数据大小受表单提交的大小限制,尽量少 |
ControlState |
单个用户 |
一个也页面范围 |
数据大小受表单提交的大小限制,尽量少 |
下面先来介绍Session
Session 可以通过System.Web.HttpContext或System.Web.UI.Page属性来访问,他是System.Web.SessionState.HttpSessionState类 的实例。
< sessionState mode="Off|InProc|StateServer|SQLServer"
cookieless="true|false|AutoDetect|UseCookie|UseUri|UseDeviceProfile"
timeout="number of minutes"
stateConnectionString="tcpip=server:port"
sqlConnectionString="sql connection string"
stateNetworkTimeout="number of seconds"
cookieName=”指定的session标识的cookie名称,默认是ASP.NET_SessionId”
allowCustomSqlDatabase=”[True|False]”
stateConnectionString=”TCPIP=SERVER:PORT”
/>
Mode 属性定义了Session保存的位置,
成员 |
属性 |
Off |
不保存 |
Inproc |
服务器的ASP.NET 工作的进程中,InProc模式是ASP.NET 默认的模式 |
StateServer |
在ASP.NET 工作的进程之外,由windows服务器进程进行管理,位置由stateConnetionString属性进行指定 |
SQLServer |
在ASP.NET 工作的进程之外的sqlserver中,位置由stateConnetionString属性进行指定 |
Custom |
Session存在自定义的数据存储区中 |
用Inproc模式是将数据保存在内存中,所以比较快,但是如果数据量多了,服务器资源就会消耗比较多。
保存在StateServer和SQLserver中对象必须是可以序列化和反序列化的。由于序列化和反序列化需要时间,所以性能不如Inproc好
EnableSessionState属性可以设置是否使用Session在<%@Page%>和web.config里都可以设置
Session使用:
Session 使用很简单
Session[“sessionname”]=value;
读Session时:
If(Session[“sessionname”]!=null)
{
string str=(string)Session[“sessionname”];
}
Session
变量是Object型的,使用时要强值类型转换。
Application 状态
Application 状态是所有用户所提供的,他存储于内存中,具有较高的性能。适合放用户公共信息,如数据库连接字符串等,
由于Application 状态是ASP.NET应用程序中所有用户之间的全局信息共享的,因此在修改Application对象时需要对数据进行锁定,修改完后解锁
如:
Application.Lock()
If(Application[“onlinename”]==null)
{
Application[“onlinenamecount”]=0;
}
Else
{
Application[“onlinenamecount”]=(int)Application[“onlinenamecount”]+1;
}
Application.UnLock();
HttpContext状态
HttpContext封装了Http请求的 详细信息。
如
Rrques对象,
Respone对象
Session 对象
Server对象
Application对象
Current属性是HttpContext使用的静态属性代表Http请求
可以在任何时刻使用,也是共享数据的基础。Httpcontext可以用System.Web.UI.Page.Context属性进行访问在请求过程中用Items属性来在一个请求中共享数据
以下代码在一个页面中赋值,并可以在另外的一个页面中得到这个值。
protected void Page_Load(object sender, EventArgs
e)
{
Context.Items["userdata"]
= "http://dotnet.aspx.cc/";
Server.Transfer("HttpContext2.aspx");
}
protected void Page_Load(object sender, EventArgs
e)
{
Response.Write(Context.Items["userdata"]);
}
Context存储的数据子当前的请求周期之内,如果上面的代码用Response.Redirect来进行转向则不能得到数据。因为他先发送到客户端,在由客户端发送一个新的HTTP请求,数据已经丢失。
Cache
Cache类似于Application和session,但是比Session和Application更加灵活。
最大的好处是设置数据的过期时间,依赖项和自爱数据从Cache中移除通知应用程序
Cache["userdata"] =
"http://dotnet.aspx.cc";
string UserData = "";
if (null != Cache["userdata"])
{
UserData = (string)Cache["userdata"];
}
Cache常用的是Add和Insert方法,这两个方法可以设置对象具有的依赖项,过期和优先级策略以及一个从cache移除插入项时通知应用程序的委托,两者的区别是:
如果cache中已经保存了具有相同的KEY参数的项,则Add失效,但是insert会修改此KEY,不能用Cache的Item属性向缓存中添加具有依赖项的项。
if
(Cache["key"] == null)
{
DateTime dt = DateTime.Now;
CacheDependency cdp = new
CacheDependency(Server.MapPath("test.txt"), dt);
Cache.Insert("key", dt, cdp);
}
Cookie
Cookie 是一小段字符信息当用户请求页面时他就伴随着用户请求在web服务器和浏览器中来回传递。
Cookie的值是存在客户端的,
创建Cookie可以用HttpResponse对象的Cookie集合发送到浏览器,
下面用两种方法创建Cookie:使用HttpCookie创建的Cookie要提供Cookie的名字;
Response.Cookies["userdata"].Value = "http://online.cumt.edu.cn";
Response.Cookies["userdata"].Expires = DateTime.Now.AddDays(1);
Response.Cookies["userdata"].Path = "/";
HttpCookie
hc = new HttpCookie("mycookie");
hc.Expires = DateTime.Now.AddDays(1);
hc.Path = "/";
hc.Value = "mxh";
Response.Cookies.Add(hc);
还可以创建多值Cookie
Response.Cookies["use"]["name"]
= "fly";
Response.Cookies["use"]["pwd"]
= "fly";
Response.Cookies["use"].Expires = DateTime.Now.AddHours(2);
HttpCookie
hc2 = new HttpCookie("mycookie2");
hc2["name"]
= "fly";
hc2["pwd"]
= "fly";
hc2.Expires = DateTime.Now.AddHours(2);
读取Cookie
Cookie 的读取通过Request对象的Cookie属性来进行,在读取Cookie之前要判断Cookie是否存在,下面是读取Cookie的例子:
Response.Write("<li>userdata=" + Request.Cookies["userdata"].Value + ";Path: " + Request.Cookies["userdata"].Path);
多值cookie读取:
if
(Request.Cookies["userdata"] != null)
{
Response.Write("<li>username=" + Request.Cookies["username"]["name"]);
Response.Write("<li>pwd=" + Request.Cookies["username"]["pwd"]);
}
删除Cookie
很简单:
Response.Cookies["username"].Expires
= DateTime.Now.AddHours(-1);
删除多值Cookie方法:
HttpCookie
hc3 = Request.Cookies["use"];
hc3.Value.Remove("name");
hc3.Value.Remove("pwd");
QueryString一般是用于地址栏传值的。
一般要求不超过255个字符。
接受Query的传值有多种
Request.QueryString["id"];
Request["id"];
Request.Params["id"];
Request.QueryString.Get["id"];
Request.QueryString.GetValues["id"];
用QueryString的数据直接被暴露在地址栏中这样是很危险的,如:
Delept.aspx?id=3
如果没有设置权限,或没有加密那么很可能被删除!!
参考文献:《asp.net 2.0 应用开发技术》 孟宪会等