本篇文章為大家展示了分布式中redis是怎樣實現(xiàn)Session,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
創(chuàng)新互聯(lián)堅持“要么做到,要么別承諾”的工作理念,服務領域包括:成都網(wǎng)站設計、做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣等服務,滿足客戶于互聯(lián)網(wǎng)時代的湖南網(wǎng)站設計、移動媒體設計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡建設合作伙伴!
這里我要使用的是網(wǎng)友提供給的一種方自定義Session,需要繼承System.Web.SessionState.SessionStateStoreProviderBase實現(xiàn)自己的SessionStateStoreProvide,下面講解如何實現(xiàn)自定義的RedisSessionStateStore。
SessionStateStoreProviderBase是asp.net提供的定義數(shù)據(jù)存儲區(qū)的會話狀態(tài)提供程序所需的成員。像常用InProcSessionStateStore(mode="InProc"),SqlSessionStateStore(mode="SQLServer"),都是繼承SessionStateStoreProviderBase實現(xiàn)的存儲。我們來看看msdn對其成員的定義
成員 | 說明 |
---|---|
InitializeRequest 方法 | 執(zhí)行會話狀態(tài)存儲提供程序必需的所有初始化操作。 |
EndRequest 方法 | 執(zhí)行會話狀態(tài)存儲提供程序必需的所有清理操作。 |
Dispose 方法 | 釋放會話狀態(tài)存儲提供程序不再使用的所有資源。 |
GetItemExclusive方法 | 從會話數(shù)據(jù)存儲區(qū)中檢索會話的值和信息,并在請求持續(xù)期間鎖定數(shù)據(jù)存儲區(qū)中的會話項數(shù)據(jù)。GetItemExclusive方法設置幾個輸出參數(shù)值,這些參數(shù)值將數(shù)據(jù)存儲區(qū)中當前會話狀態(tài)項的狀態(tài)通知給執(zhí)行調(diào)用的 SessionStateModule。 如果數(shù)據(jù)存儲區(qū)中未找到任何會話項數(shù)據(jù),則GetItemExclusive方法將 locked 輸出參數(shù)設置為false,并返回 null。這將導致 SessionStateModule調(diào)用 CreateNewStoreData 方法來為請求創(chuàng)建一個新的SessionStateStoreData 對象。 如果在數(shù)據(jù)存儲區(qū)中找到會話項數(shù)據(jù)但該數(shù)據(jù)已鎖定,則GetItemExclusive方法將 locked 輸出參數(shù)設置為true,將 lockAge 輸出參數(shù)設置為當前日期和時間與該項鎖定日期和時間的差,將 lockId 輸出參數(shù)設置為從數(shù)據(jù)存儲區(qū)中檢索的鎖定標識符,并返回 null。這將導致SessionStateModule隔半秒后再次調(diào)用GetItemExclusive方法,以嘗試檢索會話項信息和獲取對數(shù)據(jù)的鎖定。如果 lockAge 輸出參數(shù)的設置值超過ExecutionTimeout值,SessionStateModule將調(diào)用ReleaseItemExclusive方法以清除對會話項數(shù)據(jù)的鎖定,然后再次調(diào)用 GetItemExclusive方法。 如果 regenerateExpiredSessionId屬性設置為 true,則 actionFlags 參數(shù)用于其 Cookieless 屬性為 true的會話。actionFlags 值設置為 InitializeItem (1) 則指示會話數(shù)據(jù)存儲區(qū)中的項是需要初始化的新會話。通過調(diào)用CreateUninitializedItem 方法可以創(chuàng)建會話數(shù)據(jù)存儲區(qū)中未初始化的項。如果會話數(shù)據(jù)存儲區(qū)中的項已經(jīng)初始化,則 actionFlags 參數(shù)設置為零。 如果提供程序支持無 Cookie 會話,請將 actionFlags 輸出參數(shù)設置為當前項從會話數(shù)據(jù)存儲區(qū)中返回的值。如果被請求的會話存儲項的 actionFlags 參數(shù)值等于InitializeItem枚舉值 (1),則 GetItemExclusive方法在設置 actionFlags |
GetItem方法 | 除了不嘗試鎖定數(shù)據(jù)存儲區(qū)中的會話項以外,此方法與GetItemExclusive方法執(zhí)行的操作相同。GetItem方法在 EnableSessionState屬性設置為 ReadOnly時調(diào)用。 |
SetAndReleaseItemExclusive方法 | 采用當前請求的 HttpContext實例、當前請求的SessionID值、包含要存儲的當前會話值的SessionStateStoreData對象、當前請求的鎖定標識符以及指示要存儲的數(shù)據(jù)是屬于新會話還是現(xiàn)有會話的值作為輸入。 如果 newItem 參數(shù)為 true,則SetAndReleaseItemExclusive方法使用提供的值將一個新項插入到數(shù)據(jù)存儲區(qū)中。否則,數(shù)據(jù)存儲區(qū)中的現(xiàn)有項使用提供的值進行更新,并釋放對數(shù)據(jù)的任何鎖定。請注意,只有與提供的 SessionID值和鎖定標識符值匹配的當前應用程序的會話數(shù)據(jù)才會更新。 調(diào)用 SetAndReleaseItemExclusive方法后,SessionStateModule調(diào)用 ResetItemTimeout 方法來更新會話項數(shù)據(jù)的過期日期和時間。 |
ReleaseItemExclusive方法 | 采用當前請求的 HttpContext實例、當前請求的SessionID值以及當前請求的鎖定標識符作為輸入,并釋放對會話數(shù)據(jù)存儲區(qū)中的項的鎖定。在調(diào)用 GetItem或GetItemExclusive方法,并且數(shù)據(jù)存儲區(qū)指定被請求項已鎖定,但鎖定時間已超過 ExecutionTimeout值時會調(diào)用此方法。此方法清除鎖定,釋放該被請求項以供其他請求使用。 |
RemoveItem方法 | 此方法在 Abandon方法被調(diào)用時調(diào)用。 |
CreateUninitializedItem方法 | 采用當前請求的 HttpContext實例、當前請求的SessionID值以及當前請求的鎖定標識符作為輸入,并向會話數(shù)據(jù)存儲區(qū)添加一個 actionFlags值為InitializeItem的未初始化項。 如果 regenerateExpiredSessionId屬性設置為 true,則 CreateUninitializedItem方法用于無 Cookie 會話,這將導致遇到過期會話 ID 時,SessionStateModule會生成一個新的 SessionID值。 生成新的 SessionID值的過程需要瀏覽器重定向到包含新生成的會話 ID 的 URL。在包含過期的會話 ID 的初始請求期間,會調(diào)用 CreateUninitializedItem方法。SessionStateModule獲取一個新的 SessionID值來替換過期的會話 ID 之后,它會調(diào)用CreateUninitializedItem方法以將一個未初始化項添加到會話狀態(tài)數(shù)據(jù)存儲區(qū)中。然后,瀏覽器重定向到包含新生成的 SessionID值的 URL。如果會話數(shù)據(jù)存儲區(qū)中存在未初始化項,則可以確保包含新生成的 SessionID值的重定向請求被視為新的會話,而不會被誤認為是對過期會話的請求。 會話數(shù)據(jù)存儲區(qū)中未初始化的項與新生成的 SessionID值關聯(lián),并且僅包含默認值,其中包括到期日期和時間以及與 GetItem和 GetItemExclusive方法的actionFlags參數(shù)相對應的值。會話狀態(tài)存儲區(qū)中的未初始化項應包含一個與 InitializeItem枚舉值 (1) 相等的actionFlags值。此值由 GetItem和GetItemExclusive方法傳遞給SessionStateModule,并針對 SessionStateModule指定當前會話是新會話。然后,SessionStateModule將初始化該新會話,并引發(fā) Session_OnStart事件。 |
CreateNewStoreData方法 | 采用當前請求的 HttpContext實例和當前會話的Timeout值作為輸入,并返回帶有空ISessionStateItemCollection 對象的新的SessionStateStoreData對象、一個HttpStaticObjectsCollection 集合和指定的 Timeout值。使用 GetSessionStaticObjects 方法可以檢索 ASP.NET 應用程序的 HttpStaticObjectsCollection實例。 |
上面的定義有點長,其實很多都在說明一點那就是原生了Session是單線程的方式實現(xiàn)的,當多個進行讀的時候會加鎖后面的會等待。我們下面實現(xiàn)的去掉了這些鎖,加快并發(fā)讀寫。
繼承SessionStateStoreProviderBase實現(xiàn)自己的RedisSessionStateStore也很簡單,只需繼承SessionStateStoreProviderBase重寫CreateNewStoreData,CreateUninitializedItem,GetItem等幾個方法即可,下面貼出代碼,參考InProcSessionStateStore實現(xiàn)。
使用也很簡單,修改web.config
然后可以保持原先代碼不變,像Session["UserCode"]="admin"方式進行使用,但是現(xiàn)在的Session已經(jīng)具備了分布式的特征,支持跨域。這里得說一下該方式的缺點,在GetItem和SetAndReleaseItemExclusive時需要對鍵值對進行反序列化和序列化操作,對于保存數(shù)據(jù)量大的情況反而性能相對于系統(tǒng)提供的方式大打折扣,所以使用的時候需要考慮自己的實際場景。
上述內(nèi)容就是分布式中Redis是怎樣實現(xiàn)Session,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
網(wǎng)站題目:分布式中Redis是怎樣實現(xiàn)Session
網(wǎng)站網(wǎng)址:http://aaarwkj.com/article36/pesgsg.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供外貿(mào)網(wǎng)站建設、全網(wǎng)營銷推廣、App設計、建站公司、ChatGPT、定制網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)