您的位置:首页 > 数据库 > Redis

redis + Tomcat 8 的session共享解决

2017-05-25 00:00 148 查看
如果英文不错的看,建议直接看官网吧,官网写的挺清楚。下面的内容是转载的一篇文章,自己补充了一些,供大家参考,也欢迎大家一起讨论

官方截止到2015-10-12前是不支持Tomcat8的,详情见官网:https://github.com/jcoleman/tomcat-redis-session-manager

锐洋智能修改的支持Tomcat8的reyo.redis.session.manager.tomcat8



修改的源代码:RedisSessionManager.java

@SuppressWarnings("deprecation")
privatevoidinitializeSerializer()throwsClassNotFoundException,IllegalAccessException,InstantiationException{
log.info("Attemptingtouseserializer:"+serializationStrategyClass);
serializer=(Serializer)Class.forName(serializationStrategyClass).newInstance();

Loaderloader=null;

if(getContainer()!=null){
loader=getContainer().getLoader();
}

ClassLoaderclassLoader=null;

if(loader!=null){
classLoader=loader.getClassLoader();
}
serializer.setClassLoader(classLoader);
}

修改后的内容

privatevoidinitializeSerializer()throwsClassNotFoundException,IllegalAccessException,InstantiationException{
log.info("Attemptingtouseserializer:"+serializationStrategyClass);
serializer=(Serializer)Class.forName(serializationStrategyClass).newInstance();

Loaderloader=null;
Contextcontext=this.getContext();
if(context!=null){
loader=context.getLoader();
}

ClassLoaderclassLoader=null;

if(loader!=null){
classLoader=loader.getClassLoader();
}
serializer.setClassLoader(classLoader);
}

前提:你已经部署了Redis,尚未学会的略过

其实很简单,就几个步骤:
1.配置Tomcat的conf目录下的context.xml文件:

1>单点Reids配置

<ValveclassName="reyo.redis.session.manager.tomcat8.RedisSessionHandlerValve"/>
<ManagerclassName="reyo.redis.session.manager.tomcat8.RedisSessionManager"
host="localhost"
port="6379"
database="0"
password="reyo"
maxInactiveInterval="60"/>
2>Sentinel集群配置:

<!--Sentinel配置-->

<ValveclassName="reyo.redis.session.manager.tomcat8.RedisSessionHandlerValve"/>
<ManagerclassName="reyo.redis.session.manager.tomcat8.RedisSessionManager"

maxInactiveInterval="60"

sentinelMaster="mymaster"

sentinels="127.0.0.1:26379,127.0.0.1:26380,127.0.0.1:26381,127.0.0.1:26382"/>

2.添加jar



3.测试

1>
存储Session:

protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
System.out.println("hello");//取得Session对象
HttpSessionsession=request.getSession();
//设置Session属性
for(inti=0;i<100000;i++){
session.setAttribute("name"+i,"Magci_"+i);
}
}
2>重启Tomcat:假如Session保存在tomcat下,重启后Session不存在;如果保存在Redis下,Tomcat重启对Session无影响

3>取出Session:

protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
System.out.println("hello");
HttpSessionsession=request.getSession();
//取出Session属性
for(inti=0;i<100000;i++){
System.out.println(session.getAttribute("name"+i));
}
}
注意事项:从Tomcat6开始默认开启了Session持久化设置,测试时可以关闭本地Session持久化,其实也很简单,在Tomcat的conf目录下的context.xml文件中,取消注释下面那段配置即可:

<!--UncommentthistodisablesessionpersistenceacrossTomcatrestarts-->
<!--
<Managerpathname=""/>
-->
需要注意的是:

web.xml中的配置是有效的,即使是context.xml总配置maxInactiveInterval默认60秒,只要web.xml中的sessionConfig配置30分钟,则session的失效时间还是30分钟。

运行效果图:

一:redis主从服务器



二:redisSentinel集群(三台)







三:tomcat8.x集群(两台)



Sentinel集群下的tomcat...



四:nginx作为前端服务器



五:网站运行效果图:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: