A. 谁能告诉我C#中缓存的生命周期
缓存这个概念很广.
在Asp.Net环境下,页面,控件都可以设置输出缓存,并且可以设置过期时间.Asp.Net的HttpContext对象有个Cache属性,可以设置数据缓存,可以设置过期时间.可能你会用到一些第三方缓存库(比如微软的企业库)或者分布式缓存库(大名鼎鼎的Memcache),这些都是可以设置过期时间的.
在Windows应用程序下,由于没有了HttpContext对象,所有缓存机制得靠自己实现.
至于缓存的生命周期,输出缓存是一个绝对过期时间,超出该时间则缓存失效.数据缓存可以设置绝对过期时间和相对过期时间,在相对过期时间范围内没有访问该缓存,则失效,否则继续延长缓存期限.第三方缓存一般设计的是绝对过期时间.
在内存吃紧的时候,CLR会自动清理缓存已满足应用程序需要,这种特殊情况过期时间不一定靠谱.
B. IIS怎么设置全局cache-control网页缓存或expires过期时间麻烦告诉我
比如像apache的mod_expires的header
set
cache-control
"max-age=3600"这句代码一样,IIS有没有类似的设置,由于是虚拟主机,所以配置文件是httpd.ini
C. 谁熟悉APACHE的缓存配置
Apache中关于页面缓存的设置
Expires、Cache-Control、Last-Modified、
ETag是RFC
2616(HTTP/1.1)协议中和网页缓存相关的几个字段。前两个用来控制缓存的失效日期,后两个用来验证网页的有效性。要注意的是,
HTTP/1.0有一个功能比较弱的缓存控制机制:Pragma,使用HTTP/1.0的缓存将忽略Expires和Cache-Control头。我们
这里以Apache2.0服务器为例,只讨论HTTP/1.1协议。
Expires
Expires字段声明了一个网页或URL地址不再被浏览器缓存的时间,一旦超过了这个时间,浏览器都应该联系原始服务器。RFC告诉我们:“由于推断的失效时间也许会降低语义透明度,应该被谨慎使用,同时我们鼓励原始服务器尽可能提供确切的失效时间。”
对于一般的纯静态页面,如html、gif、jpg、css、js,默认安装的Apache服务器,不会在响应头添加这个字段。Firefox浏览
器接受到相应后,如果发现没有Expires字段,浏览器根据文件的类型和“Last-Modified”字段来推断出一个合适的失效时间,并存储在客户
端。推测出的时间一般是接受到响应时间后的三天左右。
Apache的expires_mole模块可以在Http响应头部自动加上Expires字段。在Apache的httpd.conf文件中进行如下配置:
#启用expires_mole模块
LoadMole expires_mole moles/mod_expires.so
# 启用有效期控制
ExpiresActive On
# GIF有效期为1个月
ExpiresByType image/gif A2592000
# HTML文档的有效期是最后修改时刻后的一星期
ExpiresByType text/html M604800
#以下的含义类似
ExpiresByType text/css “now plus 2 month”
ExpiresByType text/js “now plus 2 day”
ExpiresByType image/jpeg “access plus 2 month”
ExpiresByType image/bmp “access plus 2 month”
ExpiresByType image/x-icon “access plus 2 month”
ExpiresByType image/png “access plus 2 month”
对于动态页面,如果在页面内部没有通过函数强制加上Expires,例如header(”Expires: ” . gmdate(”D, d M
Y H:i:s”) . ” GMT”),Apache服务器会把Wed, 11 Jan 1984 05:00:00 GMT
作为Expires字段内容,返回给浏览器。即认为动态页面总是失效的。而浏览器仍然会保存已经失效的动态页面。
可以发现Firefox浏览器总是缓存所有页面,不管失效、不失效还是没有声明失效时间。即使缓存中声明了一个网页的实效日期是1970-01-
01 08:00:00,浏览器仍然会发送该文件在缓存中的Last-Modified和ETag字段。
如果在服务器端验证通过,返回304状态,浏览器就还会使用此缓存。
Cache-Control
Cache-Control字段中可以声明多些元素,例如no-cache, must-revalidate,
max-age=0等。这些元素用来指明页面被缓存最大时限,如何被缓存的,如何被转换到另一个不同的媒介,以及如何被存放在持久媒介中的。但是任何一个
Cache-Control指令都不能保证隐私性或者数据的安全性。“private”和“no-store”指令可以为隐私性和安全性方面提供一些帮
助,但是他们并不能用于替代身份验证和加密。
Apache的mod_cern_meta模块允许文件级Http响应头部的控制,同时它也可以配置Cache-Control头(或任何其他头)。响应头文件是放在原始目录的子目录中,根据原始文件名所命名的一个文件。具体用法请参阅Apache的官方网站。
其中Cache-Control :
max-age表示失效日期。如果没有启动mod_cern_meta模块,Apache服务器会把Expires字段中的日期换算成以秒为单位的一个
delta值,赋值给max-age。如果启动mod_cern_meta模块,并且配置了max-age值,Apache会将这个覆盖Expires字
段。同时,max-age隐含了Canche-Control: public。这样浏览器接受到的Cache-Control :
max-age和Expires值就是一致的。
如果失效日期Cache-Control : max-ag=0或者是负值,浏览器会在对应的缓存中把Expires设置为1970-01-01 08:00:00。
Last-Modified
Last-Modified和ETag是条件请求(Conditional
Request)相关的两个字段。如果一个缓存收到了针对一个页面的请求,它发送一个验证请求询问服务器页面是否已经更改,在HTTP头里面带上”
ETag”和”If Modify Since”头。服务器根据这些信息判断是否有更新信息,如果没有,就返回HTTP 304(Not
Modify);如果有更新,返回HTTP 200和更新的页面内容,并且携带新的”ETag”和”Last-Modified”。
使用这个机制,能够避免重复发送文件给浏览器,不过仍然会产生一个HTTP请求。
一般纯静态页面本身都会有Last-Modified信息,Apache服务器会读取页面文件中的Last-Modified信息,并添加到http响应头部。
对于动态页面,如果在页面内部没有通过函数强制加上Last-Modified,例如header(”Last-Modified: ” .
gmdate(”D, d M Y H:i:s”) . ”
GMT”),Apache服务器会把当前时间作为Last-Modified,返回给浏览器。
无论是纯静态页面还是动态页面,Firefox浏览器巧妙地按照接受到服务器响应的时间设置缓存页面的Last-Modified,而不是按照http响应头部中的Last-Modified字段。
ETag
既然有了Last-Modified,为什么还要用ETag字段呢?因为如果在一秒钟之内对一个文件进行两次更改,Last-Modified就会不正确。因此,HTTP/1.1利用Entity Tag头提供了更加严格的验证。
Apache服务器默认情况下,会对所有的静态、动态文件的响应头添加ETag字段。
在Apache的httpd.conf文件中可以通过FileETag指令配置该选项。FileETag指令配置了当文档是基于一个文件时用以创建
Etag(entity tag)响应头的文件的属性。在Apache
1.3.22及以前,ETag的值是对文件的索引节(INode),大小(Size)和最后修改时间(MTime)进行Hash后得到的。
如果一个目录的配置包含了‘FileETag INode MTime Size’而其一个子目录包含了‘FileETag
-INode’那么这个子目录的设置(并会被其下任何没有进行覆盖的子目录继承)将等价于‘FileETag MTime Size’。
在多台负载平衡的服务器环境下,同一个文件会有不同的etag或者文件修改日期,浏览器每次都会重新下载。设置‘FileETag None’可以使响应头不再包含ETag字段。
D. 页面缓存可以设置某个时间点过期吗
ctx.Cache.Insert("stmodel",stModel,null,
MyClass.getSpecificDateTime(),System.Web.Caching.Cache.NoSlidingExpiration,System.Web.Caching.CacheItemPriority.Default,OnCachedItemRemoved);
()
{
TimeSpancurrentTime=DateTime.Now.TimeOfDay;
DateTimenewTime=DateTime.Now;
if(currentTime.Hours<7){
newTime=newTime.Date+newTimeSpan(7,0,0);
}elseif(currentTime.Hours<11){
newTime=newTime.Date+newTimeSpan(11,0,0);
}elseif(currentTime.Hours<15){
newTime=newTime.Date+newTimeSpan(15,0,0);
}elseif(currentTime.Hours<19){
newTime=newTime.Date+newTimeSpan(19,0,0);
}else{
newTime=DateTime.Now.AddDays(1);
newTime=newTime.Date+newTimeSpan(7,0,0);
}
returnnewTime;
}
这个例子是每天的7,11,15,19四个时间点过期,
E. asp如何设置静态内容缓存时间
<%Dimtime2,time1
time1=timer
Url="http://www.ourcy.com/index2.asp"
cacheTime=600'缓存时间,单位为s秒
'强制生成!
IfRequest.QueryString("g")<>""ThenCallmakecache()
'判断自动生成!
Ifapplication("ourcyindex")<>""AndisDate(application("tqexpire_ourcyindex"))Then'如果缓存的日期存在并且符合时间日期格式
IfCDate(application("tqexpire_ourcyindex"))<Now()Thenmakecache()'如果缓存到期时间小于了现在的时间,就是过期了,调用生成缓存过程。
Else
makecache()'如果缓存日期不存在或者不符合时间日期格式,直接调用生成过程。
EndIf
time2=timer
'这是我为了去掉我站内的执行时间而进行的替换,你可以不管,直接输出application("ourcyindex")就行了
response.writeReplace(application("ourcyindex"),"[email protected]","[email protected]执行时间"&FormatNumber((time2-time1)*1000,1)"毫秒缓存过期:"&application("tqexpire_ourcyindex")"")
'定义生成缓存过程
Submakecache
List_PageCode=getHTTPPage(Url)
application.lock
application("ourcyindex")=List_PageCode
application("tqexpire_ourcyindex")=dateadd("s",cacheTime,Now())
application.unlock
EndSub
FunctiongetHTTPPage(url)
IF(IsObjInstalled("Microsoft.XMLHTTP")=False)THEN
Response.Write"<br><br>服务器不支持Microsoft.XMLHTTP组件"
Err.Clear
Response.End
ENDIF
OnErrorResumeNext
Dimhttp
SEThttp=Server.CreateObject("Msxml2.XMLHTTP")
Http.open"GET",url,False
Http.send()
IF(Http.readystate<>4)THEN
ExitFunction
ENDIF
getHTTPPage=BytesToBSTR(Http.responseBody,"GB2312")
SEThttp=NOTHING
IF(Err.number<>0)THEN
Response.Write"<br><br>获取文件内容出错"
'Response.End
Err.Clear
ENDIF
EndFunction
FunctionBytesToBstr(CodeBody,CodeSet)
DimobjStream
SETobjStream=Server.CreateObject("adodb.stream")
objStream.Type=1
objStream.Mode=3
objStream.Open
objStream.WriteCodeBody
objStream.Position=0
objStream.Type=2
objStream.Charset=CodeSet
BytesToBstr=objStream.ReadText
objStream.Close
SETobjStream=NOTHING
EndFunction
'===========================================
'作用:检查组件是否已经安装
'返回值:True----已经安装
'False----没有安装
'===========================================
FunctionIsObjInstalled(objName)
OnErrorResumeNext
IsObjInstalled=False
Err=0
DimtestObj
SETtestObj=Server.CreateObject(objName)
IF(0=Err)THENIsObjInstalled=True
SETtestObj=NOTHING
Err=0
EndFunction
FunctioncleanTime(str)
Dimre
Setre=newregExp
re.pattern="(执行时间)(.*?)(毫秒)"
re.IgnoreCase=false
re.Global=True
str=re.Replace(str,"")
cleanTime=str
EndFunction
%>
这是一个缓存页面的做法,有设置时间,你可以直接调用它的做法。
F. 设置页面在失效前被缓存的时间是什么意思
你应该是说的页面缓存失效时间,比如你改了页面引入的js,刷新的时候并不会生效,因为实际上浏览的是缓存的页面,并没有载入新写的JS,缓存失效过了之后会重新读一遍就会把新写的js读进去了,这个一般都是项目和服务器配置,跟前端无关