页面处理流程-页面生命周期-服务器控件树
整页缓存
页面缓存机制
一句话,浏览器会自动缓存静态网页。
数据库缓存依赖
文件缓存依赖
缓存依赖项一变,就写入数据。
浏览器和服务器基于Http协议的缓存机制
1.浏览器访问 静态页面(Html/图片/Css/Javascript) 那么在浏览器缓存中会保存一个副本;
1.1 使用get请求:浏览器再使用get请求访问过的静态页面时,浏览器直接读取浏览器缓存的副本;
1.2 如果强制刷新,那么浏览器就会发送请求报文给服务器,但是,会带上一个浏览器缓存该页面的时间,添加到请求报文中发给服务器。
那么服务器发现请求报文里有If-Modified-Since时间,则会强制发送一个 304状态码给浏览器,并不读取请求的服务器端静态页面。
2.浏览器访问 动态页面(.aspx/.ashx),服务器会在响应报文中添加一个 Cache-Control:private,那么浏览器读到这个报文命令后,就不会在缓存中保存副本;
当再次请求这个动态页面的时候,直接发送请求报文给服务器,服务器执行被请求的动态页面的PR方法,生成响应报文发回浏览器(仍包含:Cache-Control:private)。
浏览器请求服务器:
1.带失效时间:If-Modifed-Since
1.1 如果时间失效,则创建页面对象,执行页面代码,生成html
1.2 如果时间未失效,直接返回304,不创建页面对象。
2.请求中不带失效时间:If-Modifed-Since,直接检查服务器当前页面是否有缓存
2.1 有,则读取缓存内容,发回浏览器 2.2 没有,创建页面对象,生成html
服务器缓存
1.为动态页面开启服务器缓存
2. 一旦为某个页面开启服务器缓存,服务器为产生响应报文 添加了新命令行:
2.1 Expires,代表服务器端该页面的缓存失效时间
2.2 Last-Modified,代表服务器改页面的缓存生成时间
3.当浏览器访问一个 服务器的动态页面的时候,该页面如果在服务器生成了缓存版本,那么服务器就会在响应报文里添加:Expires和Last-Modified。
那么,当浏览器接收到这个包含Expires和Last-Modified的响应报文后,就会在浏览器端生成一个缓存副本。
3.1 如果浏览器再次使用get请求服务器这个动态页面,那么浏览器会直接从浏览器缓存中获取这个页面内容。
3.2 如果浏览器强制(刷新)请求服务器这个动态页面,那么浏览器会发送一个不一样的请求报文,里面包含了一个 If-Modified-Since!
那么,服务器接收到这个请求报文后,会先根据 If-Modified-Since时间和url去服务器缓存池中判断被请求的页面缓存是否已经失效,如果没有失效,直接返回 304状态码给浏览器,让浏览器从自己的缓存中读取页面。
为什么要这样呢? 因为可以介绍响应报文的长度,节约传输时间。
3.3 但是,如果有其他浏览器再来访问的时候,由于其他浏览器没有接收过Last-Modified,所以发送的请求报文里不带If-Modified-Since,那么服务器就直接前往缓存池中,读取该页面缓存的html代码,并生成响应报文发给这个浏览器,并为这个浏览器也发送 Last-Modified时间。
那么,这个浏览器下次再强制访问时,也会带上If-Modifed-Since了。
4.页面缓存,为制定url参数的值 结合 页面路径 生成相同页面但不同的缓存版本
那么服务器就会结合 url+参数id的值 的方式来保存不同的缓存版本了。
如果要根据url里多个参数生成不同缓存版本时,就使用 , 隔开。
<%@ OutputCache Duration="30" VaryByParam="id,name" %>
如果要根据url里所有的参数生成不同缓存版本时,就是用 * .
<%@ OutputCache Duration="30" VaryByParam="*" %>
5.自定义缓存 Cache
if (Cache.Get("myDog") == null) { Dog dog = new Dog() { Name = "Ruiky" }; //添加缓存项 Cache.Add("myDog", dog, null, System.Web.Caching.Cache.NoAbsoluteExpiration, new TimeSpan(0, 0, 3), System.Web.Caching.CacheItemPriority.Normal, CacheItemRemovedCallback); Response.Write("保存dog"); } else { Dog dog = Cache.Get("myDog") as Dog; Response.Write("嘿~~~我家的小狗~~~:" + dog.Name + ",死了~~~~"); }
缓存的 回调函数,在缓存移除的时候会被调用
/// <summary> /// 缓存被移出时的回调函数 /// </summary> public void CacheItemRemovedCallback(string key, object value, CacheItemRemovedReason reason) { System.IO.File.AppendAllText(Server.MapPath("Log.txt"), "缓存被移出啦:" + key + "=" + value + "移除原因:" + reason.ToString() + " "); }
5.1文件缓存依赖
凡是添加了 依赖对象的缓存键值对,都会在依赖项发生改变的时候,自动被移出!
1.缓存(Cache)和Session的异同:
缓存和Session都存在服务器端。
但是 Session在服务端会为当前用户分配一个SessionID并以Cookie的方式发回给浏览器,只有带这个SessionID的请求才能够访问Session池里的这个Session对象;
而Cache是没有ID的,在服务器端保存的缓存数据,所有的浏览器用户都能访问;
2.使用缓存的两个前提条件:
a.经常被访问(才有使用缓存的必要)
b.数据修改频率不高(不会被经常修改)
c.或者 允许存在脏数据
Session
1.存放的位置:进程内Session(aspnet_wp.exe),专门的状态服务中(aspstate服务),存数据库
1.1 进程内Session,服务器关闭就自动关闭;
缺点:容量较小,当出现大数据量的时候会自动重启,从而丢失所有的Session。
1.2 状态服务:专门一个存放Session的进程,不随服务器关闭和启动,存放的数据量也比较大。
缺点:关闭电脑就没了。
1.3 数据库:存数据库中,优点是永久保存,
缺点需要读取硬盘。
由于浏览器SessionId无法长久保存,所以一般不使用数据库保存Session。