帶你走進緩存世界(2):緩存入門

昨天在羣裏有個朋友問,如何使用數據庫的臨時表。問其原因,原來是他想把查詢的結果導出excel,但是苦於查詢結果是100個裏面隨機挑出50個,所以他想把查詢結果放在臨時表裏,導出的時候查詢臨時表。這個方法不是不可取,其實更好的辦法就是把查詢的結果DataTable,放到緩存裏,導出的時候直接使用就行了。然後羣裏的同學們都紛紛表明如何使用緩存。
本次我們就講下.Net Framework自帶的緩存類,這也算是走進緩存使用的大門了。

Web開發中,常用的兩個緩存對象是HttpContext.Cache和HttpRuntime.Cache,這兩個對象的類型都是System.Web.Caching.Cache類。區別是一個是當前上下文的cache一個是運行時cache,他倆的區別大家可以搜索下,我們這裏只說怎麼使用Cache類,其實他們倆沒啥區別,就web開發而言。

MSDN上有Cache類的詳細介紹http://msdn.microsoft.com/zh-cn/library/system.web.caching.cache.aspx,大家可以打開看看:

void Insert(string key,Object value)
這個方法是最常用的方法之一,就是向Cache裏增加一個緩存(key,value),如果Cache裏有就替換,沒有就是插入。

void Insert(string key,Object value,CacheDependency dependencies)
此方法和上面的類似,但是多了一個緩存依賴項參數,當依賴的內容改變時,緩存就被移除掉了,也就是無法獲取緩存了。

void Insert(string key,Object value,CacheDependency dependencies,DateTime absoluteExpiration,TimeSpan slidingExpiration)
這個方法相比上面的又增加了2個時間參數,第一個是具體的到期時間,第二個則是緩存最後使用時間和過期時間的時間差。 如果DateTime指定了具體的時間,則TimeSpan就爲Cache.NoSlidingExpiration(此類型是TimeSpan,值爲TimeSpan.Zero),如果TimeSpan指定了20分鐘,則DateTime就爲Cache.NoAbsoluteExpiration(此類型是DateTime,具體值是DateTime.MaxValue),每次使用緩存,過期時間就會推遲20分鐘。


void Insert(string key,Object value,CacheDependency dependencies,DateTime absoluteExpiration,TimeSpan slidingExpiration,CacheItemPriority priority,CacheItemRemovedCallback onRemoveCallback)
CacheItemPriority參數是個枚舉類型,從名字可以看出該值是優先級的意思,也就是優先移除比較低的緩存,該方法又多了個Callback方法參數(即委託),也就是當緩存過期時會執行該方法。


Object Remove(string key)
移除緩存,並且厚道的返回了這個緩存的值,如果沒有緩存則返回null


大致介紹了下幾個方法,瞭解他們之間的區別在於緩存的移除策略(依賴項、時間、優先級、回調函數)。

依賴項:
比如,我們的站點的配置(config.xml)放入了緩存裏,緩存的過期就依賴於config.xml的變動,跟時間沒關係。 所以我們可以採第二個Insert方法。

到期時間:
比如,我們首頁的文章列表。由於網站首頁的訪問量一般都比較大,所以不可以每次都去查詢數據庫,那麼我們可以把首頁查詢的文章列表放入緩存裏(或者把第一頁的結果放入緩存裏),但是由於列表需要更新,我們可以設置他的更新時間爲5分鐘,這樣就可以利用第三個Insert方法,把TimeSpan設置爲new TimeSpan(0,5,0)

優先級:
優先級的含義十分明白,但在普通的Web站點還不至於使用到,但如果單獨開發一個緩存服務的話,優先級還是比較重要的,在同樣的過期時間的緩存裏,會優先剔除級別比較低的緩存以釋放內存。

回調函數:
緩存被移除之後,爲了保證下次還可以使用緩存,回調函數則可以重新加在緩存。 又或者假如我們設計一個延遲更新的功能,把一些零碎的統計(比如瀏覽次數)放入緩存中,定時更新一次數據庫,這樣可以減輕數據庫的壓力,但又怕緩存丟失時更新有所偏差,所以可以用這種回調的方式保證數據的正確性。

以上是本人愚見,有不正之處還望指點。

瞭解了Cache類,就趕緊試試吧,嘗試把你以前的重複查詢優化下:)網上也有很多人寫好的CacheHelper類,不過他們不會使用全部的Insert的,因爲根據緩存數據的策略不同,側重點也不一樣。你不妨寫一個自己的Helper類。
發佈了42 篇原創文章 · 獲贊 191 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章