自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

ASP.NET通過(guò)分布式Session提升性能

開(kāi)發(fā) 后端 分布式
我們將會(huì)談到的是ASP.NET通過(guò)分布式Session來(lái)構(gòu)建高性能可擴(kuò)展的ASP.NET網(wǎng)站。

  如果我們正在使用Session,那么構(gòu)建高性能可擴(kuò)展的ASP.NET網(wǎng)站,就必須解決分布式Session的架構(gòu),因?yàn)閱畏?wù)器的SESSION處理能力會(huì)很快出現(xiàn)性能瓶頸,這類問(wèn)題也被稱之為Session同步。微軟有自己的分布式Session的解決方案,那就是SessionStateServer,我們可以參考:

  ASP.NET Session State Partitioning

  http://blog.maartenballiauw.be/post/2008/01/23/ASPNET-Session-State-Partitioning.aspx

  ASP.NET load balancing and ASP.NET state server

  http://blog.maartenballiauw.be/post/2007/11/ASPNET-load-balancing-and-ASPNET-state-server-(aspnet_state).aspx

  不過(guò)本文是要換一個(gè)方案,那就是使用Memcached來(lái)到達(dá)分布式SESSION的架構(gòu)。Memcached作為分布式的緩存服務(wù)器已經(jīng)被廣泛應(yīng)用在網(wǎng)站建設(shè)中。

  一:Session的機(jī)制

  Session是針對(duì)用戶的,我們也可以理解為是針對(duì)瀏覽器的。在瀏覽器***訪問(wèn)ASP.NET網(wǎng)頁(yè)的時(shí)候(網(wǎng)頁(yè)沒(méi)有關(guān)閉session功能),它會(huì)發(fā)送如下的HTTP頭給客戶端:

  瀏覽器在收到上面的HTTP頭后,會(huì)將這個(gè)唯一的SESSIONID保存在自己的COOKIE中(只要沒(méi)有禁用COOKIE,本文不討論禁用COOKIE的案例,可參考本博文http://www.cnblogs.com/fish-li/archive/2011/07/31/2123191.html,寫的很NICE)。當(dāng)瀏覽器再次請(qǐng)求服務(wù)器進(jìn)行訪問(wèn)的時(shí)候,它會(huì)在請(qǐng)求HTTP頭中加入如下的標(biāo)識(shí),我們可以看到,這個(gè)SESSIONID就是上面的SESSIONID:

  瀏覽器和服務(wù)器間就是通過(guò)這樣一種機(jī)制來(lái)確保用戶SESSION的。

  如果客戶端瀏覽器禁用了Cookie會(huì)怎么樣,我們會(huì)發(fā)現(xiàn)每一次刷新瀏覽器Set-Cookie都是不同的,而發(fā)送請(qǐng)求頭中也永遠(yuǎn)不會(huì)出現(xiàn)Cookie標(biāo)識(shí)。這個(gè)時(shí)候,我們會(huì)發(fā)現(xiàn)Session失效了(當(dāng)然,微軟為了防止出現(xiàn)這種情況,允許我們?cè)趕essionState中設(shè)置cookieless="true",用URL來(lái)傳遞sessionid)。

  二:Memcached Providers

  我使用的Memcached客戶端是Memcached Providers,下載完畢后,你會(huì)發(fā)現(xiàn)Memcached Providers已經(jīng)提供了對(duì)分布式Session的支持功能。如果你還不會(huì)使用Memcached Providers,請(qǐng)參考此文Memcached Tip 1:使用Memcached Providers。Memcached Providers提供的示例是直接將SESSION存儲(chǔ)在數(shù)據(jù)庫(kù),我們可以通過(guò)配置來(lái)將SESSION支持存儲(chǔ)在分布式SESSION的內(nèi)存中,即,將下文中的dbType由SQL修改為none。:

  使用Memcached Providers提供的分布式Session沒(méi)有任何特別之處,因?yàn)镸emcached Providers提供的SessionStateProvider類型實(shí)現(xiàn)的是ASP.NET中的SessionStateStoreProviderBase這個(gè)抽象類,我們可以看到配置文件中指定了Session的處理類是SessionStateProvider,所以,ASP.NET在接受到客戶端的請(qǐng)求后,會(huì)自覺(jué)滴使用SessionStateProvider來(lái)處理所有的SESSION,也正是這個(gè)類,完成了將SESSION讀取和存儲(chǔ)在Memcached中(如果設(shè)置了SQL,則會(huì)同步存儲(chǔ)到SQLSERVER數(shù)據(jù)庫(kù))。

  SESSION的設(shè)置和讀取與傳統(tǒng)沒(méi)有任何區(qū)別,讀:

 

  1.   Session["sname2"] = "sluminjxxi";  
  2.   Session.Timeout = 2; 

 

  ?。?/p>

 

  1.   Response.Write(Session["sname2"]); 

  三:為什么要配置SQL

  傳統(tǒng)的SESSION的缺點(diǎn),在僅使用dbType為none配置的時(shí)候都會(huì)存在。如Memcached的內(nèi)存到達(dá)上限的時(shí)候會(huì)怎么辦?Memcached使用LRU淘汰算法(最久未使用),在這里我們不需要去細(xì)究這個(gè)算法在Memcached內(nèi)部到底是什么樣一個(gè)機(jī)制,我們只需要知道,在內(nèi)存緊張的時(shí)候,即使SESSION時(shí)間未到,Memcached也有可能把它干掉。所以,保險(xiǎn)的做法是,在Memcached之下,再加上SQLSERVER的持久化保存。如果緩存命中的,直接取緩存,如果緩存沒(méi)命中的,則再到數(shù)據(jù)庫(kù)中確認(rèn)一次。當(dāng)然,這樣會(huì)帶來(lái)一些性能損耗,但是卻是更安全的做法。

  Memcached Providers提供的下載文件中,提供了初始化SESSION的一些腳本,正確執(zhí)行后,它會(huì)生成如下一個(gè)表tblSessions,及若干存儲(chǔ)過(guò)程:

tblSessions保存的是就是單獨(dú)的Session,如下:

四:Memcached Providers的一個(gè)BUG

  在當(dāng)前的Memcached Providers(1.2版本)中關(guān)于SessionStateProvider(29520-TRUNK)是有一個(gè)BUG(我已提交到codeplex,相信他們的下一個(gè)版本應(yīng)該能得到修正)的。如果我們測(cè)試SESSION失效時(shí)間,發(fā)現(xiàn)只要經(jīng)過(guò)一次刷新后,就永遠(yuǎn)是20分鐘(即默認(rèn))。這源于在ReleaseItemExclusive這個(gè)重載方法中(該方法用于釋放對(duì)會(huì)話數(shù)據(jù)存儲(chǔ)區(qū)中項(xiàng)的鎖定),對(duì)于Session的重新存儲(chǔ)沒(méi)有加上過(guò)期時(shí)間,如下:

  注釋掉的是Memcached Providers提供的源碼,而正確的應(yīng)該是我修正過(guò)的上一條。使用修正過(guò)的DLL,一切圓滿了。

  五:采用數(shù)據(jù)庫(kù)存儲(chǔ)SESSION的可擴(kuò)展問(wèn)題

  隨著訪問(wèn)量的進(jìn)一步上升(當(dāng)然,到了這種程度,說(shuō)明網(wǎng)站做的很很成功,絕大部分的網(wǎng)站是不需要考慮這一步的),即便我們使用了Memcached作緩存,使用單一的SQLSERVER存儲(chǔ)SESSION仍舊帶來(lái)了性能問(wèn)題,在這種情況下,我們對(duì)于數(shù)據(jù)庫(kù)的設(shè)計(jì)可以采用水平分區(qū)的架構(gòu),即根據(jù)某種算法(可以根據(jù)SESSIONID,或者用戶名等)將SESSION存儲(chǔ)到不同的數(shù)據(jù)庫(kù)中。這個(gè)時(shí)候,如果我們?nèi)耘f使用Memcached Providers,那么必須進(jìn)一步修改源碼了,由原先支持單一SQLSERVER服務(wù)器,編程支持多個(gè)服務(wù)器。當(dāng)然,如果不喜歡SQLSERVER,還可以修改為支持mysql、mongodb、任何自定義的KEY-VALUE框架等等,此為后話,暫且不表。

原文鏈接:http://www.cnblogs.com/luminji/archive/2011/11/03/2195704.html

【編輯推薦】

  1. ASP.NET MVC會(huì)成為ASP.NET未來(lái)主流的UI平臺(tái)?
  2. ASP.NET性能優(yōu)化之構(gòu)建自定義文件緩存
  3. 想愛(ài)容易相處難:當(dāng)ASP.NET MVC愛(ài)上IoC
  4. 導(dǎo)致ASP.NET站點(diǎn)重啟的十大原因
  5. 淺談ASP.NET核心對(duì)象
責(zé)任編輯:彭凡 來(lái)源: 博客園
相關(guān)推薦

2009-07-28 16:57:50

ASP.NET Ses

2009-05-11 14:46:32

MySQL分區(qū)提升性能

2024-11-28 08:57:21

分布式鏈路Skywalking

2009-07-23 18:56:50

ASP.NET Ses

2009-07-29 10:19:48

Session StaASP.NET

2009-08-03 10:07:20

ASP.NET Ses

2009-12-10 09:23:13

ASP.NET開(kāi)發(fā)

2009-07-22 18:02:26

ASP.NET Ses

2009-07-10 09:39:25

ASP.NET網(wǎng)站性能

2009-07-24 10:41:00

ASP.NET Ses

2009-07-20 17:21:43

Session狀態(tài)ASP.NET

2012-03-12 13:54:56

ASP.NET

2011-10-14 10:37:54

ASP.NET

2019-10-29 14:22:44

阿里云云計(jì)算認(rèn)證測(cè)試

2009-02-23 15:55:29

ASP.NET.NET性能提升

2014-07-31 09:28:09

ASP.NETWeb API

2009-07-31 18:16:09

ASP.NET中的Se

2023-12-29 08:18:31

Session分布式系統(tǒng)微服務(wù)

2009-08-05 18:30:36

Session和CooASP.NET表單

2009-07-24 10:41:00

ASP.NET Ses
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)