帶你走進緩存世界(1):漫談緩存

         什麼是緩存?對於剛入門的朋友來說可能比較模糊,或是隻知道是個提高性能的東東。我按我的理解說一下:緩存的目的就是爲了提高性能,而把一些數據存放在內存裏,方便程序反覆使用,所以緩存就是放在內存裏的那些數據。那麼我們在開發程序時,比如定義了一個靜態變量,這個靜態變量的值一般都會被一直存放在內存裏,這個變量就是緩存了。當然這個緩存的生命週期是第一次被調用直到程序結束。也並非說只有全局的靜態變量才叫緩存。比如我們在一個httpRequest接收開始便聲明瞭當前上下文(CurrentContext),那麼在整個頁面的生命週期裏,我們都可以獲得當前上下文,那麼這個Context也是緩存。 假如我們把複雜數據查詢結果放在一個數據表裏,以供其他程序調用,那這個臨時表就是緩存表,也是緩存。總之,緩存就是爲提高性能而存在的。緩存,就是開闢了一些內空間來換取程序的運行時間。
         我們在開發的日常工作中,經常會碰到各種緩存,最常見的莫過於瀏覽器緩存,經常需要強刷新才能看到頁面被修改的結果。這是瀏覽器的緩存策略,某些頁面你刷新多次,如果你會使用firebug或ie9的網頁開發工具(F12)或chrome自帶的開發工具(Ctrl+Shift+c)或httpwatch的話,你可以觀察network一項,來看所有的http請求的狀況,如果被緩存的話,status就不是200,而是304(not modified),這樣你的服務器就不會接收這個請求。一般靜態資源(圖片、js、css、html)都會被緩存起來。
         還有就是DataSet(ADO.NET裏的類,非.NET程序員可能不清楚)。DataSet是ADO.NET相對於ADO的亮點之一。他亮就亮在不需要一直與數據庫連接。他是先把數據讀取出來放入DataTable裏,然後由程序員針對DataTable做數據處理。這麼做的目的就是不佔用數據庫連接,假如用戶的每一條數據處理非常耗時,如果不用DataSet而用DataReader的話,那麼如果訪問量稍微大一些就會出現連接數過多的異常或者連接排隊過多而導致超時的異常或者數據庫非常緊張而導致所有查詢都是慢查詢的糟糕情況。所以這個DataSet也是緩存的概念,雖然可能僅僅是短短的一個方法的生命週期,但其思想沒變。
         理解了緩存的意思,那麼該如何使用緩存?我們先思考下什麼樣的數據可以緩存或需要緩存?一般來說是比較常用的數據,公共的數據需要緩存。常用是相對於程序說來,比如網站的配置信息,到處都需要調用,最好緩存起來。公共是相對瀏覽者來說,某個瀏覽者的私有信息是不適合放入緩存的,比如賬戶信息,這些一般用Session來存放。事實上,Session也是緩存,Session的值存放於服務端的內存裏,而每個Session對應一個SessionID,SessionID的信息存放於客戶端的cookie裏。程序每次調用Session的值時,先要從瀏覽器發送的cookie裏找到一個SessionID,然後再從內存裏找對應該ID的Session值,所以來說Session也是緩存。但我說是公共數據是因爲在我們未來講到的所使用的緩存裏,不適合存放相對用戶的私有數據。

         從CSDN的博客來說,相對於瀏覽者的公共信息,有博客的資料、側邊欄、文章、評論,除了瀏覽者自己的信息外,貌似都是公共信息。那都要緩存嗎?那就是要看緩存的必要性。假如不是CSDN,而是一個訪問量不高的個人博客,如果把公共數據都緩存起來,難免有些自找麻煩的感覺。因爲訪問量不大,就是都緩存,這個性能的提升也是毫無意義的,而且從開發的角度來講,增加了大量的工作(每增加、修改、刪除都會牽扯到緩存的更新),但對於CSDN來講,如果不緩存,或許數據庫早就支撐不住掛掉了。可見緩存也是把雙刃劍,用的好壞全看項目的需求。

         今天就先開個引子,後面我會對博客案例的緩存架構進行分析,各種緩存技術和策略一一道來。喜歡的盆友們不要錯過。
發佈了42 篇原創文章 · 獲贊 191 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章