session共享redis儲存設計與實現

2021-08-19 03:03:56 字數 1910 閱讀 5093

session的實現原理簡介

背景:

1.  由於http協議是無狀態的,服務端如何識別客戶端請求呢,只能依靠http報文中新增部分頭字段來實現請求識別(如何在請求body或這引數中設定會員引數,伺服器端會話就與自定義的會員識別繫結到一起)

2.  基於瀏覽器的web應用,請求都是有瀏覽器發起的,貌似也不能手動隨便新增請求頭(僅有xmlhttprequest可以手動設定請求頭),哪有沒有一種可以由服務端生成,客戶端請求是自動在請求中設定對應頭字段的技術呢,這就是cookie

cookie:

cookie是在客戶端負責儲存的,既可以客戶端生成,也可以伺服器端生成,cookie總是儲存在客戶端中,按在客戶端中的儲存位置,可分為記憶體cookie和硬碟cookie:

(1)記憶體cookie由瀏覽器維護,儲存在記憶體中,瀏覽器關閉後就消失了,其存在時間是短暫的

(2)硬碟cookie儲存在硬碟裡,有乙個過期時間,除非使用者手工清理或到了過期時間,硬碟cookie不會被刪除

(3)cookie一些重要的屬性,path,domain,maxage,secure,httponly,可以自己去研究一下

(4)服務端生成cookie的響應頭為

(5)客戶端傳送http請求帶的cookie請求頭

cookie

:amcv_niwodai%40adobeorg=-15069…7-badf-4795-9c64-eb9960c23d48

session的實現原理:

(1)服務端首先查詢對應的cookie的值(sessionid)

(2)根據sessionid,從伺服器端session儲存中獲取對應id的session資料,進行返回

(3)如果找不到sessionid,伺服器端就建立session,生成sessionid對應的cookie,寫入到響應頭中

session共享實現

傳統的session由伺服器端生成並儲存,當應用進行分布式集群部署的時候,如何保證不同伺服器上session資訊能夠共享呢?

兩種實現方式:1.session集中儲存(redis,memcached,hbase等),2. 不同伺服器上session資料進行複製,兩種方式的優缺點,大家應該一目了然

基於session集中儲存的實現方案:

(1)新增filter,攔截請求,包裝httpservletrequest

(2)改寫getsession方法,從session儲存中獲取session資料,返回自定義的httpsession實現

(3)在生成新session後,寫入sessionid到cookie中

redis儲存session的需要考慮問題

1.  session資料如何在redis中儲存?

2.  session屬性變更何時觸發儲存?

我們的實現:

考慮到session中資料類似map的結構,採用redis中hash儲存session資料比較合適,如果使用單個value儲存session資料,不加鎖的情況下,就會存在session覆蓋的問題,因此使用hash儲存session,每次只儲存本次變更session屬性的資料,避免了鎖處理,效能更好

如果每改乙個session的屬性就觸發儲存,在變更較多session屬性時會觸發多次redis寫操作,對效能也會有影響,我們是在每次請求處理完後,做一次session的寫入,並且之寫入變更過的屬性

如果本次沒有做session的更改, 是不會做redis寫入的,僅當沒有變更的session超過乙個時間閥值(不變更session重新整理過期時間的閥值),就會觸發session儲存,以便session能夠延長有效期

Redis實現session共享

1.session共享是基於spring redis來實現的,首先從web.xml開始說起。2.在web.xml裡面配置了乙個filter,如下 springsessionrepositoryfilter org.springframework.web.filter.delegatingfilter...

redis實現session共享,實現單點登入

所需環境 兩台伺服器a和b模擬集群 兩台電腦 乙個mysql5.7,redis伺服器,demo分別部署在a和b中,a中名為demo1,b中名為demo2 為了加以區分 mysql5.7和redis都是在b中開啟的 測試原理 demo1在a中訪問login.jsp頁面登入進去之後會在瀏覽器儲存乙個js...

通過redis使雙系統session共享的解決思路

兩個系統a和b a為主,b為次 登入入口是a a登入時,生成乙個隨機碼token,例如uuid 將token做為key,userid做為value,存入redis,設定過期時間 將token存入cookie,設定過期時間,設定domain a,b系統通過cookie獲取token,然後從redis獲...