web中緩(huǎn)存(cún)的使用
很多人都知道什麽叫緩存,甚(shèn)至學習過,但用起來還(hái)真難用。我經(jīng)過幾天的學習(xí)cache想(xiǎng)跟(gēn)大(dà)家分享(xiǎng)和討論。
我是帶著(zhe)疑問去學習的。緩存是用在(zài)什(shí)麽地方,有什(shí)麽好(hǎo)處(chù)。
緩存就(jiù)是(shì)把獲取(qǔ)的數(shù)據暫(zàn)時存到緩存中,當獲取的數據沒有變化時就還是用(yòng)緩(huǎn)存裏的東西。可能有(yǒu)人會問怎麽判斷(duàn)獲(huò)取(qǔ)的數據沒有變化?這個等下會說到。這樣從(cóng)緩存數據可是獲取數據速度快很(hěn)多,但要求(qiú)數據不時時常變化的。像博(bó)客園(yuán)裏的博客排(pái)行榜(bǎng),基本沒變化,這(zhè)是雖是數據不(bú)怎麽變(biàn)化,但這樣頁麵每個人(rén)瀏(liú)覽都是一(yī)樣的東(dōng)西,那又(yòu)何必用緩存幹什麽呢?直接把此頁麵生成html,這樣打(dǎ)開的速度比用緩存還快。
當一個頁(yè)麵既(jì)有公共部分(每個(gè)人瀏覽的都一(yī)樣(yàng))又(yòu)有個性部分(自己的信息)。比如當當(dāng)網裏就有個購物車當你購完物時(shí),底單上麵有推薦買的產品(這也產品可(kě)能(néng)一(yī)天換一次(cì)),當然推薦的產品跟你買的產品有關,此時不能生成html了,因(yīn)為不(bú)是每(měi)個人(rén)瀏覽此頁麵都(dōu)相同,隻有當用戶買的產品相關到(dào)推薦的產品相同時。此(cǐ)時就要用緩存存此推薦產品的數據,當(dāng)然這(zhè)個緩存鍵(jiàn)值是(shì)跟買的產(chǎn)品有關,隻要買的產品相關得到的推薦(jiàn)產(chǎn)品(這裏麵有一種關係在裏麵)才(cái)能該(gāi)緩存的東西(xī)。
打個比方:當你買(mǎi)書時就會推薦其他(tā)好書給你,此時買書的推薦書都一樣,調用的緩存都一樣,而(ér)買(mǎi)電腦的話可能會推薦你各種好電腦(nǎo)給你(nǐ),這時(shí)調用推薦(jiàn)電腦的緩(huǎn)存。
上(shàng)麵(miàn)可(kě)能講(jiǎng)了下(xià)緩存用在什麽地方,當(dāng)然(rán)我隻知(zhī)道這種情(qíng)況,可能(néng)還有其他情況,那(nà)位知道可評論下。
緩存的好處當然(rán)是減輕服務器的(de)負(fù)擔,加快瀏覽速度(dù)。但(dàn)如果緩存用得不好,可能得到的數據是過時(shí)的,或者反而使瀏覽熟讀更慢。(當你緩存經常(cháng)變化的數據時)
緩存(cún)有分客(kè)戶端緩存(cún)服務器端緩存嗎?
兩個都有,隻是客戶(hù)端緩存內嵌(qiàn)在瀏覽(lǎn)器中,基本上是瀏覽器自(zì)動處(chù)理緩存(cún)。
客戶端緩存可以有效地減輕服務器(qì)端負載(zǎi)。首先了解一(yī)下(xià) HTTP 頭:Last-Modified 與(yǔ) If-Modified-Since。簡單的說(shuō),Last-Modified 與If-Modified-Since 都(dōu)是用於(yú)記錄頁麵最(zuì)後修(xiū)改時間的 HTTP 頭(tóu)信息,隻是 Last-Modified 是由服務(wù)器往(wǎng)客(kè)戶端發送的 HTTP 頭,而 If-Modified-Since 則是由(yóu)客(kè)戶端往服(fú)務(wù)器發送的頭實現。
在瀏覽器可設置瀏覽器如何使用緩存的(de)。一般(bān)默認(rèn)是自動。操作步(bù)驟(zhòu)如下(xià):
工具(jù)-》internet選項-》常規-》設置(zhì)-》檢查網頁的(de)較新版本(běn)中有四個選項來(lái)控製緩存(cún)的運用
當然代碼可控製客戶端緩存,比如比想(xiǎng)要瀏覽器(qì)緩存(cún)東西可用下(xià)麵(miàn)代碼
html禁用(yòng)客(kè)戶端緩存
以下為引用的內容: <META HTTP-EQUIV="pragma" CONTENT="no-cache"> <META HTTP-EQUIV="Cache-Control" CONTENT="no-cache, must-revalsidate"> <META HTTP-EQUIV="expires" CONTENT="Wed, 26 Feb 1978 08:21:57 GMT"> |
C#中禁止cache的方法!
以下(xià)為引用的內容(róng): Response.Buffer = true; Response.ExpiresAbsolute=System.DateTime.Now.AddSeconds(-1); Response.Expires=0; Response.CacheControl="no-cache"; |
我對客戶端(duān)緩存知(zhī)道太少,而且我們寫程序也很少寫客戶端緩存, 希望有人(rén)提供更(gèng)多關(guān)於客(kè)戶端緩(huǎn)存的東西。
服務端緩存有System.Web.Caching.cahe和memcached
當然System.Web.Caching.cahe是微(wēi)軟寫(xiě)的類(lèi),而memcached是第三方插件(jiàn)。System.Web.Caching.cache目前還不是分布(bù)式(shì)緩存,隻能在一台(tái)電腦上(07時候(hòu)),而
memcached是分布式(shì)的高速緩(huǎn)存。
服務器緩存可分(fèn)為三(sān)種緩存
1.輸出緩存:
要實現頁麵輸出緩存(cún),隻要將一條 OutputCache 指令添加(jiā)到頁麵(miàn)即可。
<%@ OutputCache Duration="60" VaryByParam="*" %>
如同其他頁麵指(zhǐ)令一樣,該指令(lìng)應該出現(xiàn)在 ASPX 頁麵(miàn)的頂(dǐng)部,即在任何輸出之前。它支持(chí)五(wǔ)個屬性(或參數),其中兩個是必需的。
Duration
必需屬(shǔ)性。頁麵應該(gāi)被緩(huǎn)存的(de)時間,以秒為單位。必須是正整數。
locations
指定應該對輸出進行緩(huǎn)存的位置。如果(guǒ)要指定該參數,則必須(xū)是下列選項之一:Any、Client、Downstream、None、Server 或 ServerAndClient。
VaryByParam
必(bì)需屬性。Request 中變量的(de)名(míng)稱,這些變量名應該(gāi)產生單(dān)獨的緩存條目。“none” 表示沒(méi)有變(biàn)動。“*” 可用於(yú)為每(měi)個不同的(de)變(biàn)量數組(zǔ)創建新的緩存條目。變量(liàng)之間用(yòng) “;” 進行分隔。
VaryByHeader
基於指定的標頭中(zhōng)的變動改變緩存條目。
VaryByCustom
允許在(zài) global.asax 中指定自(zì)定義變動(例如(rú),“Browser”)。
2.片段(duàn)緩存:
示例
<%@ OutputCache Duration="60" VaryByParam="*" %> 該示(shì)例(lì)將緩存用戶控件60秒,並且將針對(duì)查詢字符串的每個變動、針對此控件所在(zài)的每(měi)個頁麵創建單獨的緩存條目(mù)。<%@ OutputCache Duration="60" VaryByParam="none"
VaryByControl="CategoryDropDownList" %> 該示例將緩存(cún)用戶控件60秒,並且(qiě)將針對CategoryDropDownList控件的每個不(bú)同的值、針對此控件所在(zài)的每個頁麵創建單獨(dú)的緩存條目。<%@ OutputCache Duration="60" VaryByParam="none" VaryByCustom="browser"
Shared="true" %>
最後,該示(shì)例(lì)將(jiāng)緩存用戶控件60秒,並且將針(zhēn)對每個(gè)瀏覽器名稱和主(zhǔ)要版本創建一個(gè)緩(huǎn)存條目。然(rán)後,每(měi)個瀏(liú)覽器的緩存條目將由引用此用戶(hù)控件的所有頁麵共享(隻要所有頁麵(miàn)都用相同的ID引用該控件即可)。
3.編(biān)程用(yòng)得最(zuì)多(duō)的緩存:數據緩(huǎn)存
System.Web.Caching.cahe被httpRuntime.Cache或HttpContext.Current.Cache實例(lì)化。httpRuntime.Cache,HttpContext.Current.Cache是內(nèi)置(zhì)對(duì)象就(jiù)想當與seesion。
HttpContext.Current.Cache與HttpRuntime.Cache區別:
HttpContext.Current.Cache:為當前 HTTP 請求獲取(qǔ)Cache對(duì)象。 HttpRuntime.Cache:獲(huò)取(qǔ)當前應用程序的Cache。HttpContext.Current.Cache是(shì)調用了 HttpRuntime.Cache,且(qiě)HttpContext.Current.Cache是(shì)用(yòng)在web程(chéng)序上(shàng),而HttpRuntime.Cache是用在任何程序上。System.web命名空(kōng)間下。
其實HttpContext.Current.Cache是(shì)通過 HttpRuntime.Cache來實現的(de),所(suǒ)以一般實例化最好通過HttpRuntime.Cache來(lái)實(shí)例化:
例如:System.Web.Caching.Cache cache = HttpRuntime.Cache
System.Web.Caching.Cache有很多(duō)方法,但(dàn)方(fāng)法中(zhōng)add中是存緩存
參數(shù)中有緩(huǎn)存時間,依賴項。
緩存時間即到(dào)當緩存的東西達(dá)到指定時間就(jiù)讓緩存(cún)失效,而依賴項(xiàng)是(shì)當依賴(lài)項發生變化就會使緩存失效。
依賴項(xiàng)有一般依賴項 CacheDependency和數據庫依(yī)賴(lài)項(xiàng)SqlCacheDependency。
雖(suī)然CacheDependency類完成了(le)很(hěn)重要的功能,但其(qí)組成(chéng)結(jié)構卻(què)比較簡單,主(zhǔ)要有兩個屬性(xìng)和(hé)一個方法。
— 屬性“HasChanged”:判(pàn)斷CacheDependency對象是否已更改(gǎi)。
— 屬(shǔ)性“UtcLastModified”:返回上次依賴項的修(xiū)改日期
— 方法“Dispose”:釋放CacheDependency對(duì)象所占有的資源。因為緩存(cún)類(lèi)繼承了接口“IDispose”,所(suǒ)以必須實現此方法(fǎ)。
CacheDependency
例(lì)如 Cache.Insert(“key”, myXMLFileData, DateTime.Now.AddMinutes(1),,new
System.Web.Caching.CacheDependency(Server.MapPath(“users.xml”)));
users.xml文(wén)件就相當(dāng)一般依賴(lài)項,當(dāng)xml文件被改了,則此緩存失效。
SqlCacheDependency一般是(shì)增對數據庫的,這個設置需要在config裏設(shè)置,而且還要啟動數據庫的這樣服務(wù)。
Cache.Insert 中可設置(zhì)跟數據庫中那個(gè)表關聯,一(yī)旦(dàn)表有變化就會導致cache失效。
可到網上查詢如何使用
關鍵詞:web
閱(yuè)讀本文後您(nín)有什麽感想? 已有 人給出(chū)評價!
- 0
- 0
- 0
- 0
- 0
- 0