Redis缓存session的一些问题

zw0283 2016-02-02 09:55:47
加精
最近接触这块,百度搜的资料不是很多,而且大部分都是一个介绍,谷歌上不去。。。现在有如下问题,希望有经验的前辈予以解答。
1、在不使用Redis缓存session的时候,我在action里取session都是这样:

HttpSession session = request.getSession();

我通过查阅资料得知,其原理大概就是在cookie里存放了一个sessionId,我的getSession的时候,通过这个sessionId取到对应的session。那么,我在使用Redis的时候,key是sessionId,value是session对象。这样对么?
2、Redis缓存session,我应该在哪一步将session对象放到Redis里呢?其实说到底,我就是对session对象是什么时候产生的有些搞不明白。比如我有一个网站,www.test.com。这个网站有登录功能,那么,session是在我打开www.test.com的时候就产生了,还是我点击“登录”的时候才产生的呢?
3、其实和2是一个问题。
我现在的想法如下:写一个filter,在filter里拦截所有请求,新建session和sessionId,并且把他们存到Redis里,把sessionId写到cookie里。之后在用到session的时候,直接在Redis里取session对象拿来用。我的这个想法对么?如果对,可否有前辈贴上示例代码看看。如果不对,请指正。
4、不同的容器是否实现不同?比如我在百度上看到,“Tomcat下用redis缓存session”,“weblogic下redis缓存session”。。。这些不同的容器缓存session的实现不一样么?如果不一样,那么是否代表我3中的想法是错的啊。。

以上就是我的问题,望有经验的前辈予以指导。
...全文
15605 36 打赏 收藏 转发到动态 举报
写回复
用AI写文章
36 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵伟大魔王 2017-09-14
  • 打赏
  • 举报
回复
redis合理存放session对象
cnn0314 2017-03-21
  • 打赏
  • 举报
回复
* 1.当浏览器第一次访问服务器时,request.getSession();服务器会创建一个Session对象和具有JSESSIONID属性的Cookie,浏览器会得到一个包含了sessionId的Cookie,这个Cookie的生命为-1,即只在浏览器内存中存在,如果不关闭浏览器,那么Cookie就一直存在。 * 2.当浏览器再次访问服务器时,会携带具有JSESSIONID属性的Cookie给服务器,再次执行request.getSession()方法时,因为可以通过Cookie中的sessionId找到session对象,如果没有查找到,创建session,把session保存起来,把新创建的sessionId保存到Cookie中,如果通过sessionId查找到了session对象,那么就不会再创建session对象了。 http://my.csdn.net/m0_37106742#
一个人喝不醉 2017-03-03
  • 打赏
  • 举报
回复
最终Session可能会是服务器性能影响的一个重要指标,如果单点的服务商用户量比较大,且每个登录的用户都会写入比较多的数据放入回话中(比如权限,通知,消息,....)这样服务器容器(暂且就说tomcat的吧)就需要开辟一块很大的内存来存放这些众多的用户信息,而且用户在客户端不停的切换页面查询数据,后台就会在不停的循环查询存放所有回话的变量,这是很影响系统本身负载的;所以建议除一千人以下同时访问量的系统之外,其他的系统建议使用第三方组件来存放
一个人喝不醉 2017-03-03
  • 打赏
  • 举报
回复
session是只要客户端在第一次访问这个系统的时候,后端服务器会立即生成一个唯一不重复的id(也就是sessionid)并且服务器上加入类似这样的一段代码map.add(sessionId,new Object());然后顺便将这个sessionID的值以cookie的方式写会客户端;当客户端第二次来访问的时候就会把客户端的cookieid携带到后台来,后台通过搜索全局存放session的变量Object obj = map.get(sessionid);大概就是这样一个原理;
qq_35902143 2017-02-16
  • 打赏
  • 举报
回复
你这个问题使session的跨域问题吗?如果是可以用利用sso单点的登录的原理结合redis缓存
w939800704 2016-12-02
  • 打赏
  • 举报
回复
https://my.oschina.net/wenjie001/blog/796190 巧了我也弄了个,不知道效率怎么样。帮忙看看呗
vcminusminus 2016-11-28
  • 打赏
  • 举报
回复
学习了,很实用!
宋玮-深圳 2016-02-17
  • 打赏
  • 举报
回复
http://projects.spring.io/spring-session/
Java升级之路 2016-02-17
  • 打赏
  • 举报
回复
我最近也在弄缓存,不过我用的是memcached。
qq_28569391 2016-02-14
  • 打赏
  • 举报
回复
不要沉啊。。。。
cattpon 2016-02-12
  • 打赏
  • 举报
回复
learning~
cattpon 2016-02-04
  • 打赏
  • 举报
回复
learning~
云渊阁 2016-02-04
  • 打赏
  • 举报
回复
在session 生成从页面传回后台之后,把值放进redis,key/value 的设置可以sessionId/session中的所有值(或者其中的几个值)
游北亮 2016-02-02
  • 打赏
  • 举报
回复
上面说的有些问题, SessionID的产生,不同的Web容器可能实现不一样, 从而导致a服务器上登录后,第二次请求发到b服务器,分配一个全新的Sessionid给你, 一般作法是登录成功后,把SessionID作为value,写入一个固定的Cookie name里, 判断是否登录,通过读取这个固定的Cookie name来处理
游北亮 2016-02-02
  • 打赏
  • 举报
回复
流程大致如下: 1、收到用户请求,读取SessionID,去Redis获取登录信息,没取到,告诉用户未登录 2、用户成功登录后,以SessionID为key,一些关键信息为value,存入Redis,最好设置一个过期时间,比如1天 这样这个用户被负载均衡分配到其它服务器,它的SessionID还是第1步那个,能从Redis读取到登录信息,自然认为是登录状态, 就没问题了
zw0283 2016-02-02
  • 打赏
  • 举报
回复
OK,大致明白了。其实思路就是创建filter,用以接管session的创建和取出的操作,之后重写这些方法。存储到特定的地方。。。 spring有这方面的框架,spring-session,万能的spring啊。。。多谢各位前辈的建议,在此小弟感激不尽。
游北亮 2016-02-02
  • 打赏
  • 举报
回复
确实,你的问题跟Redis本身是无关的, Redis确实可以解决你说的Session共享的问题, 1、在使用Redis的时候,key是sessionId,value是session对象。这样理解是对的 2、你在第一次打开网站时就创建了一个SessionID,只要没有关闭浏览器,你的一系列动作,包括弹窗,包括链接跳转,都是同一个SessionID,一般这个SessionID都是通过Cookie来传输,在跳转弹窗等操作中间都是同样的Cookie值 3、你的filter我没太理解,但是你通过SessionID把登录信息写到Redis,再通过SessionID读取登录信息,是可以解决你的问题的 4、不同的窗口实现是没有区别的,那些人只是刚好用到Tomcat而已
zw0283 2016-02-02
  • 打赏
  • 举报
回复
引用 14 楼 rui888 的回复:
不同容器的话写法估计不一样。你也可以看看 spring-session可以匹配任何的web容器, 这里git 上面有一个你也可以参考 tomcat-redis-session-manager
恩恩,多谢,给我很大启发。
baidu_24711553 2016-02-02
  • 打赏
  • 举报
回复
我感觉这样的搞的话,有20台机器在跑,搞个cdn是不是会好点
zw0283 2016-02-02
  • 打赏
  • 举报
回复
引用 6 楼 woailinglaipi 的回复:
我说说我的思路,不一定对,但应该可行,你自己创建一个简单的model,专门放什么用户id,头像,等级什么的.这个model和你用户model不一样,这个只定义少量的东西.然后登陆成功,你就把你用户信息赋值给这个临时model,并设置redis过期时间,....至于你前端请求是否登陆,或是否过期,你可以用拦截器来处理redis里面的东西,真正意义上的session可以不用在这.不知道对不对,大神们可以讨论下
从功能上来讲,我觉得这个方案可以解决我的问题,不过也有些麻烦的地方,就是JSP页面获取的时候,如果用session能直接获取,但是用自定义对象的话,可能要麻烦一点,不过也不失为一种方法。
加载更多回复(13)

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧