分佈式session

什麼是session

 session的官方定義是:Session:在計算機中,尤爲是在網絡應用中,稱爲「會話控制」。Session 對象存儲特定用戶會話所需的屬性及配置信息。php

 說白了session就是一種能夠維持服務器端的數據存儲技術。session主要有如下的這些特色:redis

 

 1. session保存的位置是在服務器端spring

 2. session通常來講是要配合cookie使用,若是是瀏覽器禁用了cookie功能,也就只可以使用URL重寫來實現session存儲的功能數據庫

 3. 單純的使用session來維持用戶狀態的話,那麼當同時登陸的用戶數量較多的時候,或者存在較多的數量的session會致使查詢慢的問題後端

 本質上:session技術就是一種基於後端有別於數據庫的臨時存儲數據的技術瀏覽器

分佈式session實現方式

  • tomcat+redis方案
  1. 方便,可是與tomcat容器重耦合
  2. 使用 session 的代碼,跟之前同樣,仍是基於 tomcat 原生的 session 支持便可,而後就是用一個叫作 Tomcat RedisSessionManager 的東西,讓全部咱們部署的 tomcat 都將 session 數據存儲到 redis 便可。
  • Spring session+redis
  1. 給 sping session 配置基於 redis 來存儲 session 數據,而後配置了一個 spring session 的過濾器,這樣的話,session 相關操做都會交給 spring session 來管了。接着在代碼中,就用原生的 session 操做,就是直接基於 spring sesion 從 redis 中獲取數據了。

 

 

 session的必要性

  • 主要一個緣由就是HTTP的無狀態性

 由於HTTP的無狀態性,因此咱們沒有辦法在HTTP發送請求的時候知道當前用戶的狀態,也就是好比說,當前是哪一個用戶的之類的這種信息,因此這個時候咱們須要session來標識當前的狀態tomcat

session原理機制

  1. 當程序須要爲某個客戶端的請求建立一個session的時候,服務器首先檢查這個客戶端的請求裏是否已包含了一個session標識- 稱爲session id
  2. 若是已包含一個session id則說明之前已經爲此客戶端建立過session,服務器就按照session id把這個session檢索出來使用(若是檢索不到,可能會新建一個)
  3. 若是客戶端請求不包含session id,則爲此客戶端建立一個session而且生成一個與此session相關聯的session id,這個session id將被在本次響應中返回給客戶端保存(一般保存到會話Cookie裏)

session工做原理

經過一個模擬用戶登陸的流程圖來初步理解session的原理,假設這個時候用戶執行登陸操做,具體的session工做流程以下:服務器

整個流程大概分紅這樣的幾步:cookie

1. 第一步將本地的cookie中的session標識和用戶名,密碼帶到後臺中網絡

2. 第二步後臺檢測有沒有對應的session標識,咱們以php爲例,那麼就是檢測有沒有接收到對應的PHPSESSID

3. 沒有的話直接生成一個新的session。有的話,檢測對應的文件是否存在而且有效

3. 失效的話,咱們須要清除session而後生成新的session。不失效,使用當前的session

看到這裏你可能對session的工做原理有一個初步的理解

session的原理圖以下:

 

 session的常見配置

首先咱們要在PHP的安裝目錄下面找到php.ini文件,這個文件主要的做用是對PHP進行一些配置。

  1. 設置session存放在cookie中中標識的字段名,php中默認爲PHPSESSID

  對應的設置爲:session.name = PHPSESSID

  2. 若是客戶端禁用了cookie,能夠經過設置session.use_trans_sid來使標識的交互方式從cookie變爲url傳遞

    對應的設置爲: session.use_trans_sid = 0

  3. 設置session的保存位置

  對應的設置是session.save_path="D:\phpStudy\PHPTutorial\tmp\tmp"

session的一些相關注意事項

1.關閉瀏覽器session一樣存在

   若是咱們沒有人爲的去設置cookie的生命週期的時候默認關閉瀏覽器session的狀態是沒法被保存下來的,由於沒有設置cookie的生命週期,默認這個時候cookie爲session cookie也就是在會話存在的時候cookie纔有效,因此關閉瀏覽器cookie失效,致使後端拿不到對應的PHPSESSID,因此沒法找到對應的session文件。

2.session性能瓶頸怎樣解決?

若是是後端存在大量的session的時候,那麼這個時候就會出現性能的瓶頸,例如:當後端同時存在有5000個session文件的時候,假設要找的文件是在第4999個,那麼也就是說前面至少須要遍歷4998次,這樣就會浪費過多的時間在後端的循環遍歷查找文件中,因此這個時候最有效的方法是使用redis,原理是經過將本來保存在本地的session文件寫入到內存中,經過內存換空間的形式來達到提高速度。

3. 通常不使用URL重寫的方法來傳遞PHPSESSID

其中主要有兩個緣由,一個是URL重寫方式傳遞的話會致使URL混亂,影響美觀。另外一個是增大了用戶誤操做的概率。

相關文章
相關標籤/搜索