文章來源:http://canann.iteye.com/blog/1941173
以前實現數據的緩存有很多種方法,有客戶端的Cookie,有服務器端的Session和Application。
其中Cookie是保存在客戶端的一組數據,主要用來保存用戶名等個人信息。
Session則保存對話信息。Application則是保存在整個應用程序范圍內的信息,相當於全局變量。
Session
Session用來保存每一個用戶的專有信息
Session的生存期是用戶持續請求時間加上一段時間(一般是20分鍾左右)
Session信息是保存在Web服務器內存中的,保存數據量可大可小
由於用戶停止使用應用程序之后它仍在內存中存留一段時間,因此這種方法效率較低
代碼:
Session[“UserID”]=”test”;
String UserName=Session[“UserID”].ToString();
Cookie
Cookie用來保存客戶瀏覽器請求服務器頁面的請求信息
我們可以存放非敏感的用戶信息,保存時間可以根據需要設置
如果沒有設置Cookie失效日期,它的生命周期保存到關閉瀏覽器為止
Cookie對象的Expires屬性設置為MinValue表示永不過期
Cookie存儲的數據量受限制,大多數的瀏覽器為4K因此不要存放大數據
由於並非所有的瀏覽器都支持Cookie,數據將以明文的形式保存在客戶端
代碼:
Resopnse.Cookies[“UserID”]=”test”;
String UserName= Resopnse.Cookies [“UserID”].ToString();
Cache
Cache用於在Http請求期間保存頁面或者數據
Cache的使用可以大大的提高整個應用程序的效率
它允許將頻繁訪問的服務器資源存儲在內存中,當用戶發出相同的請求后,服務器不是再次處理而是將Cache中保存的數據直接返回給用戶
可以看出Cache節省的是時間—服務器處理時間
Cache實例是每一個應用程序專有的,其生命周期==該應用程序周期
應用程序重啟將重新創建其實例
注意:如果要使用緩存的清理、到期管理、依賴項等功能必須使用Insert 或者Add方法方法添加信息
代碼:
Cache[”ID”]=”cc”;或者Cache.Insert(“ID”,”test”);
String ID =Cache[“ID”].ToString();
通常使用最頻繁的是Session,那么Session和Cache又有什么區別呢?
Session緩存和Cache緩存的區別。
(1)最大的區別是Cache提供緩存依賴來更新數據,而Session只能依靠定義的緩存時間來判斷緩存數據是否有效。
(2)即使應用程序終止,只要Cache.Add方法中定義的緩存時間未過期,下次開啟應用程序時,緩存的數據依然存在。而Session緩存只是存在於一次會話中,會話結束后,數據也就失效了。
(3)Session容易丟失,導致數據的不確定性,而Cache不會出現這種情況。
(4)由於Session是每次會話就被加載,所以不適宜存放大量信息,否則會導致服務器的性能降低。而Cache則主要用來保存大容量信息,如數據庫中的多個表。
(5)Session目前只能保存在內存中,對其性能有影響。
Cache:它存儲於 服務器的內存中,允許您自定義如何緩存項以及將它們緩存多長時間。例如,當缺乏系統內存時,緩存會自動移除很少使用的或優先級較低的項以釋放內存。該技術 也稱為清理,這是緩存確保過期數據不使用寶貴的服務器資源的方式之一。它不與會話相關,所以它是多會話共享的,因此使用它可以提高網站性能,但是可能泄露 用戶的安全信息,還由於在服務器缺乏內存時可能會自動移除Cache因此需要在每次獲取數據時檢測該Cache項是否還存在。
Cookie:Cookie 提供了一種在 Web 應用程序中存儲用戶特定信息的方法。例如,當用戶訪問您的站點時,您可以使用 Cookie 存儲用戶首選項或其他信息。當該用戶再次訪問您的網站時,應用程序便可以檢索以前存儲的信息。在開發人員以編程方式設置Cookie時,需要將自己希望保 存的數據序列化為字符串(並且要注意,很多瀏覽器對Cookie有4096字節的限制)然后進行設置。
1、session:session的確是存放在服務器的內存中(但不是4k上限,具體大小限制應該是服務器內存),而且同一個sessionid的多個 http請求會排隊,也就是session對於同一個瀏覽器來說是同步的,用不好會極大影響性能。另外,session依賴於客戶端cookie,因為 sessionid是存放在客戶端瀏覽器進程cookie中的,因此不支持cookie的瀏覽器,session也會丟失(session url重寫可部分解決這個問題,可參考:http://www.sungness.com/archives/48)。因此不建議用。
2、cookie,也不建議存放datatable這樣的“大數據”。因為cookie不僅有4k上限,並且不是“純存放在客戶端”這么簡單,要知道 cookie的值在每次web頁面請求往返的過程中都是要附帶在http頭中的,如果太大會占用服務器和客戶端之間的網絡帶寬(雖然只是4k,但在線人多 了可就是4k * n了)。對於b/s結構的應用來說,網絡帶寬是性能最主要的瓶頸之一!另外,對於datatbale轉換成json字符串再存入 cookie,服務器CPU也會消耗。最可怕的是,一但你的cookie忘記刪除了,那么在其有效期和作用域內,用戶訪問你的所有頁面時都將攜帶這個4K 大小的http頭,那就悲劇了。10000在線人數,4千兆網卡也不夠你花的。
3、數據庫連接,每次保存查詢語句然后再查詢的方式不錯,不過看你的查詢復雜度了,如果很費時的查詢,這樣調用也是不可取的。內存和cpu的矛盾你要根據 實際情況作出選擇。對於具有連接池的應用來說,一次連接數據的成本並不高,經過測試差不多=10次調用取當前系統時間函數。但查詢語句的復雜度就沒譜了。 另外,如果並發人數很多的情況下,頻繁占用數據庫連接,會導致連接池沒有可用連接了,那就又悲劇了。此時就不是一次連接的成本,系統整體性能將毀滅性的下 降,反應遲鈍。
4、cache:一個不錯的選擇,不過它可同樣是占用服務器內存哦,只是比session多了一些靈活性。不過我也不建議你用於存放傳遞參數的地方。要知 道session就算內存滿了也不會丟失你的參數值(會拋異常),可cache可不是,它會直接刪掉你的參數值,甚至內存極度不足時都不會讓你進去(也不 會報錯)。換句話說,可能上一行代碼剛存進去,下一行代碼去讀就丟了。很可怕吧~
5、form表單:最為提倡的方式,http協議中原本頁面間傳值的方法就是這樣的,只是有時不太方便,能用之則用之。