[Asp.Net]狀態管理(Session、Application、Cache)

     上篇博文介紹了在客戶端狀態管理的兩種方式:http://www.cnblogs.com/wolf-sun/p/3329773.html。除了在客戶端上保存狀態外,還能夠在服務器上保存狀態。使用客戶端的狀態,其缺點在於增長了數據在網絡之間的傳送。使用服務器端狀態的缺點在於,服務器必須給客戶端分配資源,下面詳細討論服務器端的狀態管理技術。html

服務器端的狀態管理數據庫

  1. Session

      會話狀態與瀏覽器會話相關。客戶在服務器上第一次打開Asp.Net頁面時,會話就開始了。當客戶在20分鐘以內沒有訪問服務器,會話結束,銷燬session。c#

      能夠在Global Application類(即全局應用程序類)中定義本身的代碼,會話開始或結束時運行。會建立Global.asax文件。在這個文件中,定義了一些時間處理程序例程:瀏覽器

 1  public class Global : System.Web.HttpApplication
 2     {
 3 
 4         protected void Application_Start(object sender, EventArgs e)
 5         {
 6 
 7         }
 8 
 9         protected void Session_Start(object sender, EventArgs e)
10         {
11 
12         }
13 
14         protected void Application_BeginRequest(object sender, EventArgs e)
15         {
16 
17         }
18 
19         protected void Application_AuthenticateRequest(object sender, EventArgs e)
20         {
21 
22         }
23 
24         protected void Application_Error(object sender, EventArgs e)
25         {
26 
27         }
28 
29         protected void Session_End(object sender, EventArgs e)
30         {
31 
32         }
33 
34         protected void Application_End(object sender, EventArgs e)
35         {
36 
37         }
38     }
View Code

      會話狀態能夠存儲在HttpSessionState對象中。與當前Http環境相關的會話狀態對象可使用Page類的Session屬性來訪問。在Session_Start()事件處理程序中,能夠初始化會話變量。在下面的實例中,名爲mydata的會話狀態被初始化爲0:緩存

1  protected void Session_Start(object sender, EventArgs e)
2         {
3             Session["mydata"] = 0;
4         }

      能夠在頁面中經過使用會話狀態名讀取會話狀態。服務器

1  protected void Unnamed2_Click(object sender, EventArgs e)
2         {
3             int val = (int)Session["mydata"];
4             myLabel.Text = val.ToString();
5             val += 5;
6             Session["mydata"] = val;
7         }

      要把客戶端與其會話變量關聯起來,ASP.NET默認使用一個臨時cookie和一個會話標識符(SessionId)。Asp.Net也支持沒有cookie的會話,其中的URL標識符用於把Http請求映射到同一個會話。  cookie

      Session的銷燬:網絡

Session.Abandon();//銷燬服務器端的Session對象
Session.Clear();//清空服務端的Session對象裏的鍵值對,Session對象並無從Session池裏銷燬

Session經常使用屬性、方法session

屬性 描述
SessionID

惟一用戶會話標識符asp.net

TimeOut

用戶超時(單位:分鐘),默認20分鐘

Count

會話狀態集合中的項目數

 

方法

描述

Abandon方法

用於顯式結束會話。

 

       Session的做用 就像你的銀行帳戶,錢(數據)都存在銀行裏,你就拿一張銀行卡(包含SessionId)回家,你每次去銀行取錢,只須要帶着銀行卡(包含SessionId)就能夠了。銀行就知道該將哪一個帳戶的錢(數據)給你。而不是別人帳戶裏的。每次取錢必須帶着卡才行,因此瀏覽器的每次請求,也必須帶着sessionid取數據。

Session總結

      (以前筆記中摘錄別人的一段,很容易理解,做者若是看到望指出,我將連接添加到文章中。)

  • Session提供了一種把信息保存在服務器內存中的一種方式。它能存儲任何數據類型包括自定義對象。因此像Session["user"]的返回類型是object類型。根據你想要的類型,須要進行類型轉換。
  • 每一個客戶端的Session是獨立存儲(sessionid惟一標識)。
  • Session 對象用於存儲有關用戶的信息(好比在驗證用戶是否登陸,此時能夠經過判斷Session[「user」]是否爲null進行判斷)。
  • 在整個用戶會話過程當中都會保留此信息。(保存SessionId的cookie丟失以前)
  • 當用戶在應用程序中從一個網頁瀏覽到另外一個網頁時,存儲在 Session 對象中的變量不會被丟棄。(這裏就感受像全局變量了)
  • Session只可由該會話的用戶訪問(由於SessionId以cookie的方式保存訪問者瀏覽器的緩存裏,關閉瀏覽器就沒了)
  • 用戶不能訪問或修改他人的Session(sessionid惟一標識)
  • ASP.Net已經內置了Session機制。不要放太多的對象到Session(由於存儲在服務器端的一個輔助進程裏,不穩定,數據多了容易丟失。),Session會有超時銷燬的機制。
  • Cookie是存在客戶端,Session是存在服務器端,目的是同樣的:保存和當前客戶端相關的數據(當前網站的任何一個頁面都能取到Session、Cookie)。
  • 若是瀏覽器禁用了Cookie能夠啓用Url來傳遞SessionID。
  • 能夠看到Session機制並非Http協議規定的,是ASP.net實現的,如今PHP、JSP等大部分服務端技術都實現了Session,原理都差很少。
  • Session有 自動銷燬機制(設置失效時間,默認就是滑動過時機制),若是一段時間內瀏覽器沒有和服務器發生任何的交互,則Session會定時銷燬。

注意:當會話過時或終止時,服務器就會清除 Session 對象

關於Sesiion的存儲方式:http://www.cnblogs.com/zhangkai2237/archive/2012/03/22/2410890.html能夠看這個文章寫的不錯。這裏就再也不贅述了。

2.Application

      字面翻譯:應用程序狀態,若是數據應在多個客戶端共享,就可使用應程序狀態來保存。應用程序狀態的使用方式跟Session很是類似。對於應用程序狀態,應使用HttpApplication類,經過Page類的Application屬性就能夠訪問它。

      Application能夠用來統計訪問網站的人數,在啓動Web應用程序時,初始化應用程序變量userCount。Application_Start()是global.asax文件中的時間處理程序方法,在啓動網站的第一個Asp.Net頁面時調用該方法。

1 Void Application_Start(Object sender,EventArgs e)
2 {
3     Application["userCount"]=0;
4 }

      在Session_Start()事件處理程序中,應用程序變量userCount的值會遞增。在改變應用程序變量以前,應用程序對象必須用Lock()方法鎖定,不然會出現線程問題,由於多個用戶能夠同時訪問一個應用程序變量。在改變了應用程序變量的值後,還必須調用Unlock()方法。注意鎖定和解鎖時間的時間比較短,在此時間段內,不該讀文件或數據庫中的數據。不然,其餘用戶就必須等到數據訪問完成以後才能操做。
     還用取錢的例子打比方:Application的方式比較像去自動取款機取錢的模式,你進去取錢,需將門關上(Lock),你取完錢出來(Unlock),下一我的才能進去。這樣更容易理解。

  protected void Session_Start(object sender, EventArgs e)
        {
            Application.Lock();
            Application["userCount"] = (int)Application["userCount"] + 1;
            Application.UnLock();
        }

      讀取應用程序狀態中的數據與Session狀態中的數據同樣。

 Label1.Text=Application["userCount"].ToString();

     注意:不要在應用程序狀態中存儲太多的數據,由於應用程序狀態須要服務器資源,直到服務器中止或重啓以後,纔會釋放這些資源。

     3.Cache

     高速緩存是服務端狀態,它相似於應用程序狀態,由於它在全部的客戶端上共享。高速緩存與應用程序狀態的區別是,高速緩存要靈活的多:定義狀態合適失效有不少方式。咱們不是給每一個請求讀取文件或數據庫,而是把數據存儲在高速緩存中。

     對高速緩存,須要使用System.Web.Caching命名控件和Cache類。給高速緩存添加對象的過程以下:

Cache.Add("mycache",myobj,null,DateTime.MaxValue,TimeSpan.FromMinutes(10),CacheItemPriority.Normal,null);

    Page類的Cache屬性返回一個Cache對象。使用Cache類的Add()方法,能夠把任意對象賦予高速緩存。Add()的第一個參數定義了高速緩存項的名字。第二個參數是應被高速緩存的對象。第三個參數定義了依賴關係,例如高速緩存項能夠依賴於一個文件:當文件改變時,高速緩存對象就會失效。在下面的示例中,沒有定義依賴關係,由於這個參數設置爲null。
     第4和5個參數用於設置高速緩存項的有效時間。第四個參數定義了高速緩存項失效的絕對時間,第五個參數定義了使高速緩存項失效的相對時間。在這個時間事後,就不能訪問高速緩存項了。下面的示例使用了相對時間,在高速緩存項試用了10分鐘以後失效。

     第六個參數定義了高速緩存的優先級。CacheItemPriority是一個設置高速緩存優先級的枚舉。若是asp.net工做進程有很高的內存利用率,asp.net運行庫就根據優先級刪除高速緩存項。優先級較低的項先刪除。最後一個參數定義一個方法,在刪除高速緩存項時調用該方法。當高速緩存依賴於一個文件時,就可使用最後一個參數:當文件改變時,就刪除高速緩存項,調用事件處理程序。經過這個事件處理程序,能夠再次讀取文件,從新加載高速緩存。

     使用前面介紹的索引符和會話狀態或應用程序狀態,就能夠讀取高速緩存項。在使用從cache屬性返回的對象以前,必須檢查結果是否爲null,當高速緩存失效時,結果就是null。若是從Cache索引符返回的值不是null,就能夠對返回的對象進行類型轉換,用於存儲高速緩存項:

 1 object o=Cache["mycahce"];
 2 if (o==null)
 3 {
 4      //緩存裏沒數據 或者數據變化 從新獲取數據放入緩存
 5 }
 6 else
 7 {
 8     //從緩存中取數據
 9      Myclass myobj=o as Myclass;
10 }

      參考資料:

                  c#入門經典(第4版)及網絡資源

結語:     因爲工做的緣由,老是斷斷續續,今天終於將狀態保持的幾種方式整理完了。東西比較基礎,從以前筆記中摘抄了一部分(以爲能讓當時的本身理解的),LZ一直關注博客園,天天必看,看到的好東西總會記錄在本地筆記中,這麼長時間了,不少不記得來源自哪篇文章了。實在對不起原文博主的辛勤勞動,可是從他們那裏吸取了很多東西,也會慢慢的整理出來,也會加入一些本身的理解。這裏真心感謝大牛們的分享,大家辛苦了。

相關文章
相關標籤/搜索