全部支持Servlet规范的容器都自带session管理,因而大多数人都使用HttpSession
接口存放状态信息。事实上, servlet的session会使得应用服务器水平扩展变的很是困难。redis
这无疑是一种浪费内存的方法,对于5台左右的集群还能够忍受,若是你须要几十甚至上百台集群,这就彻底不可行。数据库
该方案虽然能够避免上面的问题,可是这彻底背离了负载均衡的初衷。假若有A, B服务器,A处理session为1 ~ 5的请求,B处理session为6 ~ 10的请求,若是某个时间段内,有1 ~ 5 session的用户访问需求很是高,而6 ~ 10 session的用户不怎么访问,这样就会致使A服务器负载太高而B却十分悠闲,此时负载均衡就失去了意义。服务器
在应用编写时应该彻底弃用HttpSession
接口,而是将须要保存的状态信息放到Redis中。cookie
当用户登录时,服务器生成一个全局惟一的字符串SESSION:日期:20位随机字符串
作为redis中hash数据结构的key名,而后将该标识作为cookie返回给客户端。 以后该用户的后续请求都会带上此cookie, 咱们编写一个filter, 其做用为读取请求中的标识,从redis中取出该标识对应的数据,而后放到HttpServletRequest
对象中以供后续使用。session
使用redis自带的过时功能为session id设置过时时间,轻松实现session过时。数据结构
咱们能够将每一个用户的session id记录下来,如保存到数据库中,或者依然放在redis里,这样就能够查到某个注册用户全部session id, 轻松实现踢出登录功能。负载均衡
经过AOP, 在每一个请求完后以后,检查在请求处理过程当中有没有更新session信息,若是有则将新数据刷新到Redis中。运维
将session转移到redis中后,只要作好redis的运维工做,咱们的应用服务器已是彻底无状态的了,水平扩展时只须要添加机器而不须要改动任何一行代码。spa