|
我們搞程序的多多少少都了解點(diǎn)算法。總體來講,算法是什么?算法就是“時(shí)間”和“空間”的互換策略。我們常常考究一個(gè)算法的時(shí)間復(fù)雜度或空間復(fù)雜度,如果我們有絕對(duì)足夠的時(shí)間或空間,那么算法就不需要了,可惜這種條件是不存在的,只是在某些情況下相對(duì)來說我們不用去考慮其中一個(gè)。今天我們討論的“緩存”,自然就是“用空間換時(shí)間”的算法。 緩存就是把一些數(shù)據(jù)暫時(shí)存放于某些地方,可能是內(nèi)存,也有可能硬盤。總之,目的就是為了避免某些耗時(shí)的操作。我們常見的耗時(shí)的操作,比如數(shù)據(jù)庫的查詢、一些數(shù)據(jù)的計(jì)算結(jié)果,或者是為了減輕服務(wù)器的壓力。其實(shí)減輕壓力也是因查詢或計(jì)算,雖然短耗時(shí),但操作很頻繁,累加起來也很長,造成嚴(yán)重排隊(duì)等情況,服務(wù)器抗不住)
概念性的東西暫就不說了,說多了都是故事。現(xiàn)在我們來談?wù)劯鞣N緩存。
初學(xué).NET的朋友開始就會(huì)接觸到DataSet類,云里霧里的看著DataSet的例子程序,也不管是咋回事,用就是了。其實(shí)DataSet就是緩存,當(dāng)我們?nèi)プx取一段數(shù)據(jù)集合的時(shí)候,如果每讀取一條數(shù)據(jù)就處理一條的話,那么我們的程序和數(shù)據(jù)庫會(huì)一直連接著。假如處理一條數(shù)據(jù)的耗時(shí)可以忽略不計(jì),或者只有你一個(gè)人使用這個(gè)數(shù)據(jù)庫的話,那么數(shù)據(jù)庫一直連著也無所謂,我們寫代碼完全可以不用DataSet類。但是事實(shí)上不耗時(shí)不可能的,如果耗時(shí)嚴(yán)重的話,就會(huì)一直占用這數(shù)據(jù)庫連接,直到我們處理完畢。如果這種查詢過多,連接數(shù)就會(huì)占用過多,而且數(shù)據(jù)庫在某些操作時(shí)會(huì)鎖住表,這就會(huì)造成其他的請(qǐng)求等待,會(huì)出現(xiàn)查詢超時(shí),程序異常等現(xiàn)象。所以,我們必須先把數(shù)據(jù)拿出來,再對(duì)這些數(shù)據(jù)進(jìn)行相關(guān)的處理,盡早的關(guān)閉數(shù)據(jù)庫連接,好讓數(shù)據(jù)庫處理其他的請(qǐng)求。 所以,適時(shí)地選用DataSet或DataReader是比較重要的(說明:DataReader就是hold住連接的讀取方式)。
你可能會(huì)迷惑,不知不覺中使用了緩存(DataSet),這都是.NET幫你完成的事。可是,你可能還是不太清楚該如何使用緩存,或者說何時(shí)使用緩存。不用著急,我們一一來看。
上面說過,我們緩存的數(shù)據(jù)無非就是一些數(shù)據(jù)庫的查詢、計(jì)算結(jié)果和頻繁查詢。那么,我們?cè)趯?shí)際開發(fā)中會(huì)碰到哪些這種數(shù)據(jù)呢? 其實(shí)仔細(xì)想想這是非常常見的,比如用戶登錄后的個(gè)人資料,當(dāng)他每次點(diǎn)擊連接后造成頁面刷新,我們總不能都要去重新查詢數(shù)據(jù)庫吧?我們常常用Session來存儲(chǔ)這個(gè)人的信息,當(dāng)他退出系統(tǒng)后我們把Session清理掉,所以Session也是緩存,只不過他也是.NET給我們提供好的類,sorry,我又舉了一個(gè)你不想看到的例子,哈哈。其實(shí)Session是私有化的數(shù)據(jù),Session的數(shù)據(jù)訪問必須通過SessionID(詳情我就不多言了,大家google下),還不足以說明緩存的意義。如果把這個(gè)問題延伸下去,假如我們開發(fā)的是一個(gè)多用戶的Blog系統(tǒng), 每當(dāng)我們?cè)L問其中一個(gè)博客時(shí)都要去查詢這個(gè)博主的資料,假如A和B同時(shí)訪問一個(gè)博客時(shí),最理想的狀態(tài)就是只查詢一次,而不是兩個(gè)人都去訪問數(shù)據(jù)庫!是不是呢?其實(shí)。。。是也不是!(故事里的事,說是就是,不是也是;說不是就不是,是也不是。 :)。之所以說不是,是因?yàn)榧偃缥覀兊牟┛途W(wǎng)站每天就幾個(gè)人訪問,而且一直發(fā)展不起來,我們就沒必要用緩存,因?yàn)槭褂镁彺鎺砹烁嗟拈_發(fā)復(fù)雜度,因?yàn)槊慨?dāng)我們?nèi)ジ虏┲鞯馁Y料的時(shí)候不單單要更新數(shù)據(jù)庫的信息,我們還要去處理緩存。但是如果我們的博客訪問量非常大,就像博客園似的,如果再不緩存,那數(shù)據(jù)庫服務(wù)器早就Gameover了:),那么現(xiàn)在就來看怎么用緩存的吧。
.NET Framework提供了現(xiàn)成的緩存類供我們使用,常見的是 System.Web.HttpRuntime.Cache。每當(dāng)我們?nèi)?zhí)行 BlogDataProvier.GetBlogInfo()方法時(shí)(假定這個(gè)方法是我們獲取博主信息的方法,顧名思義嘛),需要在查詢之前先從緩存獲取數(shù)據(jù),假如數(shù)據(jù)不存在的話,再去數(shù)據(jù)庫獲取,并且把得到的結(jié)果存入緩存,并且返回該結(jié)果既可。下面我把這個(gè)方法的偽代碼寫出來,好讓從來沒用過緩存的朋友大致了解一下。
public class SqlDataProvider
{
public static object GetBlogInfo(string username)
{
//這里是從數(shù)據(jù)庫獲取BlogInfo
return null;
}
}
public class BlogDataProvider
{
public static object GetBlogInfo(string username)
{
var cacheKey = "Blog_" + username;
var blog = CacheHelper.Get(cacheKey);
if (blog == null)
{
blog = SqlDataProvider.GetBlogInfo(username);
CacheHelper.Set(cacheKey, blog);
}
return blog;
}
}
public class CacheHelper
{
public static object Get(string key)
{
return System.Web.HttpRuntime.Cache.Get(key);
}
public static void Set(string key, object value)
{
System.Web.HttpRuntime.Cache.Insert(key, value);
}
}
NET技術(shù):帶你走進(jìn)緩存世界,轉(zhuǎn)載需保留來源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。