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讀進去了,這個一般都是項目和伺服器配置,跟前端無關