博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JavaWeb: Redis存储Session方案
阅读量:7209 次
发布时间:2019-06-29

本文共 1004 字,大约阅读时间需要 3 分钟。

hot3.png

所有支持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的运维工作,我们的应用服务器已经是完全无状态的了,水平扩展时只需要添加机器而不需要改动任何一行代码。

转载于:https://my.oschina.net/u/1991646/blog/741631

你可能感兴趣的文章
文档/视图结构的应用
查看>>
从机器学习
查看>>
亚马逊最高级别华人科学家任小枫加盟阿里
查看>>
在_Linux_系统下使用_PhotoRec_&_TestDisk_工具来恢复文件
查看>>
去除inline-block元素间的空隙
查看>>
对话框嵌入到对话框 或者:窗口嵌入到窗口,一个窗口嵌入到另一个窗口
查看>>
多线程编程之二——MFC中的多线程开发
查看>>
iOS笔记【单元格右滑手势】 2017-09-09
查看>>
SEO-搜索引擎优化
查看>>
学习JDK1.8集合源码之--LinkedHashMap
查看>>
jar与war 包解压
查看>>
css outline属性
查看>>
CodeForces 939E Maximize
查看>>
[Linux] 服务器镜像定时备份解决方案 crontab+rsync+flock
查看>>
SFTP
查看>>
在线服务的黑天鹅(转)
查看>>
SLF4J warning or error messages and their meanings(转)
查看>>
为什么生产环境运行系统?
查看>>
MySQL使用总结(持续更新中 …)
查看>>
拨打电话
查看>>