1、爲何要共享session?php
(1)首先要想知道爲何要session共享,必須先了解一下session原理,這樣有助於我更好的瞭解session的共享,html
默認狀況下,php的session文件是保存在磁盤文件中。在php.ini配置文件中的配置項以下:java
session.save_handler = filesmysql
session.save_path = "N;/path"web
第一個配置項是指定使用files(文件形式)存儲session數據。redis
第二個參數指定保存的路徑。N表示生成多少級目錄(不放到一個目錄下,分散到多個磁盤目錄中去)sql
session原理詳解連接 http://www.cnblogs.com/wangtao_20/archive/2011/02/16/1955659.html數據庫
(2)個人理解是單一後端服務器是不存在session共享問題的。由於session數據保存在一臺服務器上。可是作了web集羣后,由於經過負載均衡,同一個IP訪問同一個頁面會被分配到不一樣的服務器上,後端
若是session不一樣步的話,一個登陸用戶,一會是登陸狀態,瀏覽器
一會又不是登陸狀態。這樣子登陸保存的session數據就須要進行共享了。
下圖來自互聯網:
2、session共享的方法
(1)session保存在數據庫
我理解本質是:本身寫程序(php,java均可以實現,反正是保存在數據庫中)模擬實現session的機制。
具體爲,把之前存儲在文件中的session數據存儲到數據庫中去,那麼這樣作,其實就不用到php內置的session機制了(像session_start()之類的函數都不須要去用了)。寫程序要模擬的是,從數據庫拿session數據,約定什麼狀況下數據過時了而後自動清理,
這裏是指刪除數據庫中的行。保存在文件中的時候,php有垃圾回收機制會去自動清理過時的session文件。
多服務器session同步的兩種方法:
1,用一個低端電腦建個數據庫專門存放web服務器的session,或者,把這個專門的數據庫建在文件服務器上,用戶訪問web服務器時,會去這個專門的數據庫check一下session的狀況,以達到session同步的目的。
2,這種方法是把存放session的表和其餘數據庫表放在一塊兒,若是MySQL也作了集羣了話,每一個mysql節點都要有這張表,而且這張session表的數據表要實時同步。
優勢:擴展性很強,能夠隨意增長WEB而不受影響。放在數據庫裏面安全方面好。
缺點:用數據庫來同步session,訪問量小沒有問題,若是大流量網站的話會加大數據庫的壓力,由於全部對session的操做都要進行數據庫的操做。數據庫原本就是容易產生瓶頸的地方,
若是把session還放到數據庫裏面,無疑是雪上加霜。高併發訪問的狀況下,會出現很大的性能問題。
(2)session數據存儲到客戶端的cookie中
這樣子,就不須要涉及到數據共享了。a客戶端請求的時候,原來生成在服務器的數據生成到瀏覽器的cookie中,根據cookie中的數據識別用戶。
php由原來的」從本地(也就是服務器)磁盤上讀取session數據」轉變爲」瀏覽器的cookie中讀取數據」,這樣子,
在多臺php服務器負載均衡的狀況下,即使第一秒請求是a服務器,第二秒請求是b服務器,都不須要管哪臺服務器了。反正都是讀取客戶端上的cookie數據。
通常是把session數據按照本身定義的加密規則,加密後後存在cookie中。
優勢:服務器的壓力減少了,由於session數據不存在服務器磁盤上。根本就不會出現session讀取不到的問題。
缺點:網絡請求佔用不少。每次請求時,客戶端都要經過cookie發送session數據給服務器;另外,瀏覽器對cookie的大小存在限制。每一個瀏覽器限制是不一樣的。
第二方面是安全問題:把session數據放到客戶端,通常session中存的都是重要性數據(賬號、暱稱、用戶id等),會存在安全問題。
(3)用Nosql數據庫Redis或者memcache同步session,基於內存存儲數據的性能很高,用戶併發量很大的時候尤爲合適
主要是利用內存的數據讀取速度是很快的,與磁盤讀取的速度不是一個數量級的。
使用內存存儲:方便統計在線人數,內存的速度比磁盤訪問快、內存數據庫系統可以控制內存中的過時數據自動失效(恰好符合session過時須要)。
Redis或memcache能夠作分佈式,若是沒有這功能,他也不能用來作session同步。他能夠把web服務器中的內存組合起來,成爲一個"內存池",不論是哪一個服務器產生的sessoin均可以放到這個"內存池"中,其餘的均可以使用。
優勢:以這種方式來同步session,不會加大數據庫的負擔,而且安全性比用cookie大大的提升,把session放到內存裏面,比從文件中讀取要快不少。
缺點:redis或memcache把內存分紅不少種規格的存儲塊,有塊就有大小,這種方式也就決定了,memcache不能徹底利用內存,會產生內存碎片,若是存儲塊不足,還會產生內存溢出。
==========================我是知識的搬運工========================