一緩存概念緩存的好處類型
緩存是一種用空間換取時間的技術通俗點也就是說把你得到的數據存放在內存中一段時間在這短時間內服務器不去讀取數據庫或是真實的數據源而是讀取你存放在內存中的數據這裡你會疑惑怎麼設置存放數據能存放什麼樣子的數據存放時間的設置真實數據源數據改變服務器不就讀取存在偏差?別急下面慢慢會說到的……
緩存的好處緩存是網站性能優化不可缺少的一種數據處理機制他能有效的緩解數據庫壓力例如網站每分鐘的點擊率為萬如果不使用緩存的靜態頁面這裡也沒有viewstate的情況下(viewstate會產生大量的字符串對服務器交互數據是一種壓力所以一般頁面是要禁用viewstate采用緩存的)只能是用戶點擊一次該頁面這個頁面就讀取一次數據庫這樣給數據庫造成的壓力可想而知如果這裡我們使用了緩存的話設置緩存有效期為分鐘則這一分鐘只內點擊萬次跟點擊一次是一樣的都是讀取一次數據庫數據源是被緩存在內存中了
中的緩存主要分為頁面緩存數據源緩存自定義數據緩存這三種主要類型
二數據緩存
[csharp]
public partial class WebForm : SystemWebUIPage
{
protected void Page_Load(object sender EventArgs e)
{
// Cache[date]=要緩存的數據 這裡是自定義緩存的簡單聲明使用
string datastr = DateTimeNowToLongTimeString()
ResponseWrite(第一個輸出時間+datastr+</br>) //這裡讀取的當前的時間刷新頁面時這裡的時間會隨著變化
if (Cache[date] == null) //判斷是否存在value值為date的緩存是否存在
{
Cache[date] = datastr;
ResponseWrite(第二個輸出時間為+Cache[date] + 這裡讀取的當前的時間) //這裡讀取的當前的時間刷新頁面時這裡的時間會隨著變化
}
else
{
ResponseWrite(Cache[date] + 這裡是從緩存中讀取的時間)//這裡讀取的緩存中的時間刷新頁面時這裡的隨著時間變化不會變化
}
}
}
上面數據緩存由於沒有設置緩存的過期時間所以第一個輸出時間為當前時間(刷新頁面會變)第二個輸出時間會一直為第一次存入緩存的時間(刷新頁面不變)
下面我們給數據緩存添加一些實用的參數(上代碼)
[csharp]
protected void Page_Load(object sender EventArgs e)
{
string ids=;
MaticsoftBLLScriptsBak bll = new MaticsoftBLLScriptsBak()
List<MaticsoftModelScriptsBak> list = new List<MaticsoftModelScriptsBak>()
list = bllGetAll()
for (int i = ; i < listCount; i++)
{
ids += list[i]ScriptIdToString()+;
}
ids = ids + 完; //這裡的ids為從數據庫中讀取表中的id值然後用鏈接起來的一個字符串
if (Cache[key] == null)
{
CacheInsert(key ids null DateTimeNowAddSeconds() SystemWebCachingCacheNoSlidingExpiration) //這裡給數據加緩存設置緩存時間
//key為緩存的鍵ids為緩存起來的值null為緩存依賴項這裡沒有使用緩存依賴項所以為null下面會詳細介紹緩存依賴項
//null後面為緩存的時間為秒
//最後一個參數為設置時間的格式ASPNET允許你設置一個絕對過期時間或滑動過期時間但不能同時使用
//我們這裡設置的為絕對過期時間也就是沒刷新一次頁面後緩存數據為秒秒後會從數據庫中重新獲取
ResponseWrite(cache加載為 + Cache[key] + </br>)
}
else
{
ResponseWrite(cache加載為 + Cache[key] + </br>)
}
ResponseWrite(直接加載為 + ids + </br>)
}
數據緩存將一些耗費時間的條目加入到一個對象緩存集合中以鍵值的方式存儲我們可以通過使用CacheInsert()方法來設置緩存的過期優先級依賴項等
三頁面緩存
[csharp]
protected void Page_Load(object sender EventArgs e)
{
string date = DateTimeNowToString()
ResponseWrite(date)
}
[csharp]
<%@ Page Language=C# AutoEventWireup=true CodeBehind=WebFormaspxcs Inherits=cacheWebForm %>
<%@ OutputCache Duration= VaryByParam=none %>
<!添加上這一句代碼意思是添加此頁面緩存十秒這十秒之內刷新頁面將讀緩存起來頁面的值不再執行Page_Load方法
Page_Load方法是每十秒執行一次>
<!DOCTYPE html PUBLIC //WC//DTD XHTML Transitional//EN /TR/xhtml/DTD/xhtmltransitionaldtd>
<html xmlns=//xhtml>
<head runat=server>
<title></title>
</head>
<body>
<div>
</div>
</body>
</html>
<%@ OutputCache Duration= VaryByParam=none %> 這條指令標簽為該頁面添加緩存Duration這個參數指定頁面緩存時間為秒VaryByParam這個指定頁面參數也就是這樣子的打個比方例如這樣一個頁面/knowledgesea/admin/EditPostsaspx?postid=&update=那麼他的參數也就是postid和update如果這樣頁面我們可以把指令標簽寫為<%@ OutputCache Duration= VaryByParam=postid;update %> 參數與參數之間用分號隔開這樣子也就吧每個單獨的頁面緩存起來了他緩存的就是postid=&update=或者postid=&update=等等不一樣的參數頁面全部緩存起來這裡可以使用一個簡便的方法就是<%@ OutputCache Duration= VaryByParam=* %>緩存起來所有當前的頁面下參數不一樣的頁面
ASPNET不會再執行頁面的生命周期和相關代碼而是直接使用緩存的頁面簡單點理解也就是我注釋中介紹的
四控件緩存
ObjectDataSource這樣的數據源控件可以在屬性欄中找到相應的屬性進行設置下面我列出個例子設置啟動緩存緩存時間為秒時間類型為絕對時間
<asp:ObjectDataSource ID=ObjectDataSource runat=server EnableCaching=True CacheDuration= CacheExpirationPolicy=Absolute></asp:ObjectDataSource>
沒有緩存屬性的控件要加緩存
[csharp]
protected void Page_Load(object sender EventArgs e)
{
string date = DateTimeNowToString()
TextBoxText = date;
}
[csharp]
<%@ Page Language=C# AutoEventWireup=true CodeBehind=WebFormaspxcs Inherits=cacheWebForm %>
<%@ OutputCache Duration= VaryByControl=TextBox%>
<!VaryByControl的參數為要緩存的控件id>
<!DOCTYPE html PUBLIC //WC//DTD XHTML Transitional//EN /TR/xhtml/DTD/xhtmltransitionaldtd>
<html xmlns=//xhtml>
<head runat=server>
<title></title>
</head>
<body>
<form id=form runat=server>
<div>
<asp:TextBox ID=TextBox runat=server></asp:TextBox>
</div>
</form>
</body>
</html>
這裡的TextBox控件就加了緩存這裡的緩存時間為秒也就是秒內ASPNET不會再執行頁面的生命周期和相關代碼而是直接使用緩存的頁面
五緩存依賴
[csharp]
protected void Page_Load(object sender EventArgs e)
{
string str = ;
if (Cache[key] == null)
{
str = SystemIOFileReadAllText(ServerMapPath(TextFiletxt)) //讀取TextFiletxt文件中的數據
CacheDependency dp = new CacheDependency(ServerMapPath(TextFiletxt))//建立緩存依賴項dp
CacheInsert(key str dp)
ResponseWrite(Cache[key]) //如果TextFiletxt這個文件的內容不變就一直讀取緩存中的數據一旦TextFiletxt文件中的數據改變裡面重新讀取TextFiletxt文件中的數據
}
else
{
ResponseWrite(Cache[key])
}
}
緩存依賴項使緩存依賴於其他資源當依賴項更改時緩存條目項將自動從緩存中移除緩存依賴項可以是應用程序的 Cache 中的文件目錄或與其他對象的鍵如果文件或目錄更改緩存就會過期
六配置文件中設置緩存
[csharp]
<systemweb>
<caching>
<outputCacheSettings>
<outputCacheProfiles>
<addname=ProductItemCacheProfile duration=/>
</outputCacheProfiles>
</outputCacheSettings>
</caching>
</systemweb>
[csharp]
<%@ Page Language=C# AutoEventWireup=true CodeBehind=WebFormaspxcs Inherits=cacheWebForm %>
<%@ OutputCache CacheProfile=ProductItemCacheProfile VaryByParam=none %>
<!這裡的CacheProfile參數與配置文件中的保持一至>
<!DOCTYPE html PUBLIC //WC//DTD XHTML Transitional//EN transitionaldtd>
<html xmlns=>
<head runat=server>
<title></title>
</head>
<body>
<div>
</div>
</body>
</html>
這樣就給頁面添加了緩存為秒的頁面
七緩存的回調函數
[csharp]
protected void Page_Load(object sender EventArgs e)
{
string str = ;
if (Cache[key] == null)
{
str = SystemIOFileReadAllText(ServerMapPath(TextFiletxt)) //讀取TextFiletxt文件中的數據
CacheDependency dp = new CacheDependency(ServerMapPath(TextFiletxt))//建立緩存依賴項dp
CacheInsert(key str dp DateTimeNowAddSeconds() CacheNoSlidingExpiration CacheItemPriorityLow CacheItemRemovedCallback)
//CacheItemPriority這個參數為緩存的優先級他分好多種級別為了防止緩存占滿時系統自己刪除緩存的優先順序廢除緩存的後面的為回調函數的名稱
ResponseWrite(Cache[key]) //如果TextFiletxt這個文件的內容不變就一直讀取緩存中的數據一旦TextFiletxt文件中的數據改變裡面重新讀取TextFiletxt文件中的數據
}
else
{
ResponseWrite(Cache[key])
}
}
public void CacheItemRemovedCallback(string key object value CacheItemRemovedReason reason) //這個為緩存移除時的回調函數一定要保持與 CacheInsert()方法中的最後一個參數名字一致
//這裡使用了委托你可以在 CacheInsert()這個函數中轉定義看到的所以這裡的格式就只能按我寫的這種方法簽名寫
{
SystemIOFileWriteAllText(ServerMapPath(logtxt)緩存移除原因為+reasonToString())
}
From:http://tw.wingwit.com/Article/program/ASP/201311/21830.html