使用tomcat-redis-spring session redis-manager 有没有弊端

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
您的访问请求被拒绝 403 Forbidden - ITeye技术社区
您的访问请求被拒绝
亲爱的会员,您的IP地址所在网段被ITeye拒绝服务,这可能是以下两种情况导致:
一、您所在的网段内有网络爬虫大量抓取ITeye网页,为保证其他人流畅的访问ITeye,该网段被ITeye拒绝
二、您通过某个代理服务器访问ITeye网站,该代理服务器被网络爬虫利用,大量抓取ITeye网页
请您点击按钮解除封锁&服务器(4)
使用redis实现自己的tomcat session manager(java)
最近业务扩展到了好几个tomcat,前端使用nginx,rewrite的规则设置为ip_hash,但这样如果有一个tomcat挂了,那这个用户就要重新登陆了,本来也可以忍受,但这说来说去总是一个问题,于是自己决定实现一个自己的session manager,所有的用户的session都保存到这个session manager上,获得session就到这个服务器上去获取,当session变化之后就重新把session保存到服务器上。嗯,大概就是这样。
从网上找到了一个这样的开源项目:。这个工程用在tomcat上的,基本原理是重新实现了tomcat的manager接口,使得所有的session的访问都指向redis服务器。然后部署的时候只要把相应的jar包拷贝到tomcat的lib目录,然后修改conf中的context.xml配置文件就可以了,对web应用完全透明。真是一个非常优雅的实现。所以我就以这个工程作为自己的session manager实现的基础。
这个工程使用和测试之后发现了不少问题。下面总结一下:
保存在session中的对象必须实现serializable接口,并且必须有默认构造函数
使用了java的序列化,速度比较慢
如果保存规则设置为default,那么每次都需要把整个session序列化为byte数组然后获得摘要去比较session是否变化,速度慢。
好,发现了开源工程的问题,那么我们就来修改一下。使用kryo序列化库来代替java本身的序列化,这样速度会有明显的提升,并且对象不需要有一个默认的构造函数。然后删除摘要比较的代码,只需要通过dirty标志来判断是否保存到redis,这样做需要代码配合才能保证正确性,比如session中保存了一个list,然后list中add了几个元素,这样由于list没有变化,所以manager会判断session没有变化然后不保存,就错了,所以需要代码主动标志这个session是dirty的,一行代码就可以:
session.setAttribute("__changed__")
实现过程中发现了几个很有意思的问题,这里记录一下:
kryo库解序列化出现classnotfound exception
这个问题比较有意思,牵扯到tomcat的classloader的机制,对于理解tomcat的classloader是一个非常好的例子。具体原因是这样的:tomcat的lib目录下的库都是standardclassloader加载的,但是每个webapp都会有自己的classloader,类型是webappclassloader,这里二者的关系是webappclassloader的parent是standardclassloader。记住这些。下面分析原因。
由于部署redis session manager是把库拷贝到lib目录下,那么kryo的classloader就是standardclassloader,但是session中保存的对象是webapp下的lib目录下的某个class,是由webappclassloader加载的,standardclassloader是不可能找到webappclassloader加载的类的class对象的,所以抛出异常。
解决办法:
把kryo库中的class.forName方法中的classloader修改为当前线程上下文的classloader。tomcat中线程的上下文的classloader是webappclassloader,这样就可以加载某个webapp的类了。
not arg constructor method error
还是kryo的解序列化的错误,说没有找到一个默认的构造函数。
解决办法:kryo库不需要一个默认构造函数,如果没有默认构造函数,它会使用java底层方法使用字节码构造对象。需要使用下面的代码开启这项功能:
kryo.setInstantiatorStrategy(new DefaultInstantiatorStrategy(new StdInstantiatorStrategy()));
修改后的manager性能比原来的高了大约40%左右。代码放在github上,有兴趣的可以去下载使用。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:5090次
排名:千里之外
原创:11篇
(2)(1)(4)(1)(5)使用tomcat-redis-session-manager 有没有弊端?
这两天在玩nginx负载均衡,然后tomcat的集群。涉及到session共享的问题,搜集资料之后,决定选用tomcat-redis-session-manager作为解决办法。经过今天频繁踩坑之后,终于测试成功...现在想问一下这种解决方案有什么优缺点?另外如果有上生产环境的打算,要注意什么东西呢?
请问LZ使用了这个以后能否触发HttpSessionListener中的sessionDestroyed方法?我使用这个后不能触发,去掉后就可以触发
这个方案试过,需注意是基于toncat的session同步,只是容器层的,仅支持httpsession。如果你应用层的session已经不是httpsession那就不能做到,需要换方案,基于应用层的session同步。
已有帐号?
无法登录?
社交帐号登录Tomcat 使用Redis存储Session - 今日头条()
Tomcat Redis Session Github 地址。下载 commons-pool2-2.2.jar,jedis-2.5.2.jar,tomcat-redis-session-manager-2.0.0.jar 这三个包,将其放到 tomcat 目录下的lib目录下。修改tomcat 的conf目录下的 context.xml 文件。在Context中插入下面的代码。&Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" /&
&Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
host="localhost"
port="6389"
database="0"
maxInactiveInterval="60"
/&更详细的方式可以查看github的配置。这样就配置好了一件简单的使用redis存储session的环境,对于集群可以采取相同的配置。测试Servlet:@WebServlet(urlPatterns = "/myhttp")
public class MyHttpServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取session
HttpSession httpSession = request.getS
httpSession.setAttribute("name","name");
//设置为0 永不过期
httpSession.setMaxInactiveInterval(1000);
//使httpserssion无效
httpSession.
System.out.println(httpSession.getId);
response.getWriter.print("http");
}启动tomcat,访问 http://localhost:8080/myhttp则可以在redis下看到证明环境已经配置成功,可以使用了。
不支持新版tomcat,不如使用spring session
有什么区别吗?可否教教我 // @雪山赠礼葡萄酒: 用了springboot的sessionmanager后,这个就扯蛋了,折腾我好久
用了springboot的sessionmanager后,这个就扯蛋了,折腾我好久
最新科技资讯、独到的观点和前沿的科技产品信息,覆盖通信、互联网、IT和科普探索等领域
上谈【安卓】,下论【苹果】。以扯淡的态度,面对操蛋的技术,用幽默的语言,诠释开发的经典。
专注程序员的各样编程知识,实战教程,最新动态。现在是编程的黄金时代,是程序员的ShowTime。我们不是码农,不是屌丝,也不是程序猿,我们是程序员联盟
Golang Develop
程序员编程指南、知识分享
《电子技术应用》创刊于1975年,由华北计算机系统工程研究所主办,经过30多年积淀,已成为电子、电信、工控、通讯、计算机等领域人士的首选期刊。
(C) 2016 今日头条 违法和不良信息举报电话:010-公司名称:北京字节跳动科技有限公司

我要回帖

更多关于 redissessionmanager 的文章

 

随机推荐