http協議是無狀態的,即你連續訪問某個網頁100次和訪問1次對伺服器來說是沒有區別對待的,因為它記不住你。
那麼,在一些場合,確實需要伺服器記住當前使用者怎麼辦?比如使用者登入郵箱後,接下來要收郵件、寫郵件,總不能每次操作都讓使用者輸入使用者名稱和密碼吧,為了解決這個問題,session的方案就被提了出來,事實上它並不是什麼新技術,而且也不能脫離http協議以及任何現有的web技術。
原理很簡單,假設你訪問網頁時就像逛澡堂,第一次進去你是沒有鑰匙的,這個時候你交了錢服務台就分配一把鑰匙給你,你走到**都要帶上,因為這是你身份的唯一標識,接下來你用這把鑰匙可以去開啟乙個專有的儲物櫃儲存你的衣物,遊完泳,你再用鑰匙去開啟櫃子拿出衣物,最後離開游泳池時,把鑰匙歸還,你的這次游泳的過程就是一次session,或者叫做會話,在這個例子中,鑰匙就是session的key,而儲物櫃可以理解為儲存使用者會話資訊的介質。
那麼在web server中如何實現session呢?想必看了上面的例子你會很容易理解,主要是解決兩個問題,乙個是鑰匙的問題,乙個是儲存使用者資訊的問題。對於第乙個問題,即什麼東西可以讓你每次請求都會自動帶到伺服器呢?如果你比較了解http協議,那麼答案一目了然,就是cookie,如果你想為使用者建立一次會話,可以在使用者授權成功時給他乙個cookie,叫做會話id,它當然是唯一的
首先我們應該明白,為什麼要實現共享,如果你的**是存放在乙個機器上,那麼是不存在這個問題的,因為會話資料就在這台機器,但是如果你使用了負載均衡把請求分發到不同的機器呢?這個時候會話id在客戶端是沒有問題的,但是如果使用者的兩次請求到了兩台不同的機器,而它的session資料可能存在其中一台機器,這個時候就會出現取不到session資料的情況,於是session的共享就成了乙個問題。
1.各種web框架早已考慮到這個問題,比如asp.net,是支援通過配置檔案修改session的儲存介質為sql server的,所有機器的會話資料都從同乙個資料庫讀,就不會存在不一致的問題;
2.以cookie加密的方式儲存在客戶端.優點是減輕伺服器端的壓力,缺點是受到cookie的大小限制,可能占用一定頻寬,因為每次請求會在頭部附帶一定大小的cookie資訊,另外這種方式在使用者禁止使用cookie的情況下無效.
3.伺服器間同步。定時同步各個伺服器的session資訊,此方法可能有一定延時,使用者體驗也不是很好
1. 基於nfs的session共享
nfs是net filesystem的簡稱,最早由sun公司為解決unix網路主機間的目錄共享而研發。
這個方案實現最為簡單,無需做過多的二次開發,僅需將共享目錄伺服器mount到各頻道伺服器的本地session目錄即可,缺點是nfs依託 於復 雜的安全機制和檔案系統,因此併發效率不高,尤其對於session這類高併發讀寫的小檔案, 會由於共享目錄伺服器的io-wait過高,最終拖累前端web應用程式的執行效率。
2. 基於資料庫的session共享
首選當然是大名鼎鼎的mysql資料庫,並且建議使用記憶體表heap,提高session操作的讀寫效率。這個方案的實用性比較強,相信大家普 遍在 使用,它的缺點在於session的併發讀寫能力取決於mysql資料庫的效能,同時需要自己實現session淘汰邏輯,以便定時從資料表中更新、刪除 session記錄,當併發過高時容易出現表鎖,雖然我們可以選擇行級鎖的表引擎,但不得不否認使用資料庫儲存session還是有些殺雞用牛刀的架勢。
3. 基於cookie的session共享
這個方案我們可能比較陌生,但它在大型**中還是比較普遍被使用。原理是將全站使用者的session資訊加密、序列化後以cookie的方式, 統一 種植在根網域名稱下(如:.host.com),利用瀏覽器訪問該根網域名稱下的所有二級網域名稱站點時,會傳遞與之網域名稱對應的所有cookie內容的特性,從而實現 使用者的cookie化session 在多服務間的共享訪問。
這個方案的優點無需額外的伺服器資源;缺點是由於受http協議頭信心長度的限制,僅能夠儲存小部分的使用者資訊,同時cookie化的 session內容需要進行安全加解密(如:採用des、rsa等進行明文加解密;再由md5、sha-1等演算法進行防偽認證),另外它也會占用一定的帶 寬資源,因為瀏覽器會在請求當前網域名稱下任何資源時將本地cookie附加在http頭中傳遞到伺服器。
4. 基於memcache的session共享
memcache由於是一款基於libevent多路非同步i/o技術的記憶體共享系統,簡單的key + value資料儲存模式使得**邏輯小巧高效,因此在併發處理能力上佔據了絕對優勢,目前本人所經歷的專案達到2000/秒 平均查詢,並且伺服器cpu消耗依然不到10%。
另外值得一提的是memcache的記憶體hash表所特有的expires資料過期淘汰機制,正好和session的過期機制不謀而合,降低了 過期session資料刪除的**複雜度,對比「基於資料庫的儲存方案」,僅這塊邏輯就給資料表產生巨大的查詢壓力。
SqlServer中如何解決session阻塞問題
簡介 對於資料庫運維人員來說建立session或者查詢時產生問題是常規情況,下面介紹一種很有效且不借助第三方工具的方式來解決類似問題。最近開始接觸運維工作,所以自己總結一些方案便於不懂資料庫的同事解決一些不太緊要的資料庫問題。類似方法很多理論也很多,我就不做深究,就是簡單寫乙個方案,便於菜鳥使用的。...
redis tomcat7實現session共享
ps 截止到2015 05 12前是不支援tomcat8的,詳情見官網 前提 你已經部署了redis,尚未學會的,可以移步這裡 其實很簡單,就幾個步驟 1.配置tomcat的conf目錄下的context.xml檔案 1 單點reids配置 classname com.orangefunction....
Nginx MVC負載均衡實現Session共享
了解了nginx之後,也對nginx實踐了,但是nginx的理論,我只能記得一丟丟 nginx是一款高效能的反向 伺服器,類似的伺服器還有apatch,tomcat,目前我只使用過nginx,自己也實踐了一下 這是使用nginx 的 有興趣的可以了解下 cgrain的 據我了解 nginx 可實現的...