tomcat+redis实现session共享

以下两种方式在正式线上出现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、修改tomcatcontext.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过期时间

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




方式二

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 


  



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值