以下两种方式在正式线上出现tomcat假死现象,没有找到解决方式,故目前使用spring进行session管理,暂未出现问题
http://blog.csdn.net/wwd0501/article/details/51484671
1、先用nginx或是aws elb实现tomcat服务的负载均衡,redis,tomcat的安装不在此描述,网上有很多的资源可查询。
2、添加session共享所需的jar包。由于依赖tomcat-redis-session-manager包,所以一定要注意tomcat、jedis、pool的版本问题,我正在使用的匹配版本如下:commons-pool-1.6.jar 、tomcat-redis-session-manager-1.2-tomcat-7-java-7.jar 、jedis-2.0.0.jar ,jar包下载地址:http://download.csdn.net/detail/wwd0501/9381796
3、修改tomcat的context.xml配置
<Valve className="com.radiadesign.catalina.session.RedisSessionHandlerValve" />
<Manager className="com.radiadesign.catalina.session.RedisSessionManager"
host="localhost" <!-- optional: defaults to "localhost" -->
port="6379" <!-- optional: defaults to "6379" -->
database="0" <!-- optional: defaults to "0" -->
maxInactiveInterval="60" <!-- optional: defaults to "60" (in seconds) --> />
host:redis服务端所在机器的IP
port:服务端口
maxInactiveInterval:缓存到期时间,既session过期时间
1、将 tomcat-redis-session-manager-1.2.jar 、jedis-2.6.1.jar、commons-pool2-2.2.jar 三个jar包拷贝到tomcat7/lib中。
2、在Tomcat 的conf/context.xml 文件里增加如下内容(或者在server.xml的context块中添加):
<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />
<Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
host="localhost" <!-- 可选,默认是"localhost" -->
port="6379" <!-- 可选,默认是 "6379" -->
database="0" <!-- 可选,默认是 "0" -->
maxInactiveInterval="60" <!-- 可选,默认是 "60" (单位:秒)--> />
3、重启Tomcat7,到redis 中查看session_id,如下:
127.0.0.1:6379> keys WJ*
1) "WJSESSIONID:6D5B0E0FD89E3A170B8BC5B8C112D3FD"
2) "WJSESSIONID:9546B26D78C99E8F0BF785535E319271"
3) "WJSESSIONID:839A35CFE17E900A81F50D629C104D2F"
4) "WJSESSIONID:1C287C797CF00C82BBBF37A617A3B55C"
5) "WJSESSIONID:FA2822C5021139641760754242F73393"
6) "WJSESSIONID:E904369E5B24D39B4E25515D50650EA6"
127.0.0.1:6379>
这里进行一下特殊说明:
git 开源项目是直接将SESSIONID作为key存储到redis中的,如下所示:
1) "6D5B0E0FD89E3A170B8BC5B8C112D3FD"
2) "9546B26D78C99E8F0BF785535E319271"
3) "839A35CFE17E900A81F50D629C104D2F"
4) "1C287C797CF00C82BBBF37A617A3B55C"
5) "FA2822C5021139641760754242F73393"
6) "E904369E5B24D39B4E25515D50650EA6"
修改原因包括几点:
1、项目也有使用redis 做其他数据存储,直接使用这样的key存储到redis中,直观上无法区分哪些key是用来做session共享用的。
2、项目包括好几个服务(web、wap、cms),每个服务都需要做负载均衡session共享,这样以来无法区分哪些session是属于哪个服务的。
3、很难统计每个服务的在线用户数。
我在集群部署中我的每个服务都有不同的sessionCookieName(web = WJSESSIONID、wap = MJSESSIONID、cms = CMSJSESSIONID)
不知道怎么配置的,这里简单说一下,直接在tomcat7/conf/server.xml 的最下面的Context中增加 sessionCookieName 配置即可:
<Context docBase="F:\workspace\web" path="" reloadable="false" sessionCookieName="WJSESSIONID" />
注意:tomcat-redis-session-manager-1.2.jar包下载地址:
http://download.csdn.net/detail/wwd0501/9488305
源码下载地址: http://download.csdn.net/detail/catoop/9122857