瀏覽器第一次訪問服務器的時候,服務器會建立一個session並返回給客戶端。
瀏覽器第二次訪問session的時候,會攜帶session到服務器,服務器會判斷這個session是否存在,若是不存在,則從新建立一個session。
在單機模式中,只要瀏覽器不重啓,在過時時間內,均可以保持會話。redis
此時瀏覽器可能訪問服務器A,也可能訪問服務器B,若是先訪問了A,那session是保存在A中的,此時再訪問B,session找不到,就要從新登陸了。瀏覽器
此時可能會想,經過session的粘滯,讓瀏覽器固定在某個服務器上就行了,這樣session會一直在對應的服務器上。當服務器A掛了,此時會故障轉移到B,依然要從新登陸。
服務器
既然粘滯不行,那把session同步可行嗎,當用戶登陸服務器A的時候,把A的信息也同步到B。這樣無論怎麼輪詢,都能找到session。問題有如下幾個:
一、每一個服務器都存放全部的session的信息,內存佔用空間大。
二、每次session變更都要同步,佔用網絡,網絡的延遲還會形成局部時間的不同,也就是當前系統有狀態了,好比A還沒同步sessoin到B,用戶訪問了B,又要從新登陸。
三、服務器間的session同步難度比較高,若是沒有服務發現,擴容的時候還須要知道對應的ip和端口。
四、服務器A重啓後,session還沒同步過來,訪問服務器A的用戶要從新登陸。
網絡
同步是把session存放在內存中的,那咱們能夠提取出來,放在redis中。
經過redis的方案,能夠保證服務的無狀態,便於擴容,保證了session的一致性。
缺點:
一、引入redis,還要保證redis的高可用,增長了系統的複雜性。session
上面是session存放服務端的方案,咱們也能夠經過jwt方式存在客戶端。
缺點以下:
一、生成的字符串長,每次傳輸佔用帶寬。
二、服務器解析須要佔用cpu。
三、沒辦法註銷。
四、若是想改變失效時間,就要從新生成jwt。spa