java redis 存session_JavaWeb: Redis存储Session方案
所有支持Servlet規范的容器都自帶session管理,于是大多數人都使用HttpSession接口存放狀態信息。事實上, servlet的session會使得應用服務器水平擴展變的非常困難。
使用Servlet Session時的妥協方案
Session Replication
這無疑是一種浪費內存的方法,對于5臺左右的集群還可以忍受,如果你需要幾十甚至上百臺集群,這就完全不可行。
Session Sticky
該方案雖然可以避免上面的問題,但是這完全背離了負載均衡的初衷。假如有A, B服務器,A處理session為1 ~ 5的請求,B處理session為6 ~ 10的請求,如果某個時間段內,有1 ~ 5 session的用戶訪問需求非常高,而6 ~ 10 session的用戶不怎么訪問,這樣就會導致A服務器負載過高而B卻十分清閑,此時負載均衡就失去了意義。
使用Redis進行Session存儲
在應用編寫時應該完全棄用HttpSession接口,而是將需要保存的狀態信息放到Redis中。
生成session id
當用戶登陸時,服務器生成一個全局唯一的字符串SESSION:日期:20位隨機字符串做為redis中hash數據結構的key名,然后將該標識做為cookie返回給客戶端。 之后該用戶的后續請求都會帶上此cookie, 我們編寫一個filter, 其作用為讀取請求中的標識,從redis中取出該標識對應的數據,然后放到HttpServletRequest對象中以供后續使用。
session過期
使用redis自帶的過期功能為session id設置過期時間,輕松實現session過期。
session追蹤
我們可以將每個用戶的session id記錄下來,如保存到數據庫中,或者依然放在redis里,這樣就可以查到某個注冊用戶所有session id, 輕松實現踢出登陸功能。
session更新
通過AOP, 在每個請求完后之后,檢查在請求處理過程中有沒有更新session信息,如果有則將新數據刷新到Redis中。
將session轉移到redis中后,只要做好redis的運維工作,我們的應用服務器已經是完全無狀態的了,水平擴展時只需要添加機器而不需要改動任何一行代碼。
總結
以上是生活随笔為你收集整理的java redis 存session_JavaWeb: Redis存储Session方案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: cctv5十节目有哪些?
- 下一篇: 电脑版怎么玩电脑如何玩王者荣耀iOS