Session資料共享

2021-08-16 04:11:21 字數 1554 閱讀 7104

參考文章:

比如:現在有三颱php伺服器,且實現了負載均衡,如何讓這三颱web伺服器共享session資料?

session資料預設是以檔案的形式儲存在web伺服器的磁碟上,一般都是使用者登入成功的時候,儲存session資料。

同乙個使用者登入後,就會將session儲存在某個web伺服器上,假設是儲存在伺服器a上,該使用者訪問**的其他頁面時,可能請求的就是伺服器b或伺服器c,但伺服器b或伺服器c上並沒有該使用者的session檔案,這樣,就會導致**誤認為該使用者未登入,使用者的登入狀態丟失的問題。

歸根結底,就是要解決多台web伺服器共享session的問題,至少有以下四種方法:

一、通過伺服器指令碼實現session資料同步

使用一台作為使用者的登入伺服器,當使用者登入成功之後,會將session寫到當前伺服器上,我們通過指令碼或者守護程序將session同步到其他伺服器上,這時當使用者跳轉到其他伺服器,session一致,也就不用再次登入。

缺陷:速度慢,同步session有延遲性,可能導致跳轉伺服器之後,session未同步。而且單向同步時,登入伺服器宕機,整個系統都不能正常執行。

二、將本該儲存在web伺服器磁碟上的session資料儲存到cookie中

即 用cookie會話機制替代session會話機制,將session資料儲存到客戶端瀏覽器的cookie中,這樣同乙個使用者訪問同一**時,無論負載均衡到哪台web伺服器,都不用再去伺服器請求session資料,而直接獲取客戶端cookie中的session資料。如此,同乙個使用者的登入狀態就不會丟失了。

但這樣做,有三大弊端:

把session資料放到客戶端的cookie中,一般都是重要資料(如使用者id、暱稱等),會存在安全問題,但可以將session資料加密後,再存放到cookie中,來降低安全風險。

瀏覽器對單個cookie的資料量大小限制為4k左右,因此會存在資料量的限制問題。

影響頻寬效能,降低了頁面的訪問速度。在高訪問量的情況下,使用者每次請求時,都要將客戶端cookie中的session資料傳送到伺服器,要占用較多的頻寬,進而影響訪問速度,伺服器頻寬成本增高。

三、將本該儲存在web伺服器磁碟上的session資料儲存到mysql資料庫中

sessionid還是利用cookie機制儲存到客戶端,但session資料卻存放在mysql伺服器上。(需要建立sessionid和session資料行的對應關係)

但這樣做,只適合訪問量比較小的**。如果**的訪問量比較大,對mysql伺服器會造成很大壓力。因為每次使用者請求頁面(即使是重新整理頁面)都要查詢mysql資料庫中的session資料表,進而判斷使用者的登入狀態和讀取使用者相關資訊,勢必會對資料庫伺服器造成很大壓力,這樣就會降低伺服器的響應速度,影響使用者體驗。

四、將本該儲存在web伺服器磁碟上的session資料儲存到記憶體資料庫(memcache或redis

)中memcache或redis是基於記憶體儲存資料的,效能很高,尤其是高併發的情況下尤為合適。主要是因為從記憶體中讀取資料要比從磁碟讀取資料快很多。

記憶體資料庫還支援資料過期失效的機制,正好與session的過期機制對應

資料型別,且支援記憶體資料備份到磁碟。

這裡簡單說一下,後面兩種方法的注意要點:

session共享方案

session 機制是一種伺服器端的機制,伺服器使用一種類似於雜湊表的結構來儲存資訊。session資訊預設是以檔案的形式儲存在服務端的。當程式需要為某個客戶端的請求建立乙個 session 的時候,伺服器首先檢查這個客戶端的請求 http request 裡是否已包含了乙個 session 標識 ...

Session 共享方案

一 什麼是分布式系統?分布式系統 旨在支援應用程式和服務的開發,可以利用物理架構由多個自治的處理元素組成,不共享記憶體,通過網路傳送訊息合作。分布式系統的三個特點 多節點,訊息通訊,不共享記憶體。二 什麼是session?廣義的session 指會話控制。由於http協議是無狀態的,對於不同http...

session共享問題

http協議是無狀態的 第一次訪問會生成jsessionid儲存在tomcat的concurrentmap裡伺服器,把jsessionid寫到客戶端的cookie裡面。關於cookie和session的聯絡 cookie中會包含哪些資訊 名字 值 過期時間 路徑 域 cookie會帶到http請求偷...