tomcat集群下用redis做sesssion共享的那些坑:
1,用到的三个需要放入${tomcat}/lib下的jar包:commons-pool-1.6.jar,tomcat-redis-session-manager.jar,jedis-1.5.2.jar,如果用到jedis2.0以上的,要自己去解决一下找不到类的错误,会用到commons-pool2的类,但是还是会去找低版本的,因时间仓促,没有具体是解决,都换成了低版本的。
2,更改${tomcat}/conf中的context.xml的<Context>标签中增加
<Valve className="com.radiadesign.catalina.session.RedisSessionHandlerValve"/>
<Manager className="com.radiadesign.catalina.session.RedisSessionManager"
host="localhost"
port="6379"
database="0"
maxInactiveInterval="60" />
上面的是本地的单台redis,如果需要用到哨兵模式(Sentinel)配置如下:
<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />
<Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
maxInactiveInterval="1800"
sentinelMaster="mymaster2"
password="password"
sentinels="IP1:26389,IP2:26389" />
PS:com.radiadesign.catalina.session 这个包名很多教程中都是错的(或许是版本的问题,很多写com.orangefunction.tomcat.redissessions),当时没注意,搞了好一会,所以使用时自己要查看清楚。
3,这个时候如果你是单纯在tomcat中测试是否可以,可以新增一个jsp的页面,在tomcat1中向session中setAttribute一个值,并在tomcat2中去get这个值,看是否可以取到,如果取到了说明tomcat这层的集群配置的没有问题了,网上很多的教程基本到这里就完结了,但在实际的web项目中,还有另外两个坑等着你,这是很多教程未提及的,这个时候如果你想把这个session用在你的web工程中,发现是根本不起作用的,因为在web项目中还需要这样配置:
1)在你的web.xml中加入<distributable/>这个标签,包含在</web-app>中即可,意思就是:实现session复制,分布式web容器应用。
2)这个坑不一定都会遇到,但是可以注意,就是这个时候的session是分布式的,所以要求其所setAttribute的对象一定要是可序列化的(PS:我所遇到的是项目中有人使用net.sf.json.JSONObject对象,而如果你去反编译就会发现这个json是没有序列化的,需要把这个json对象再toString一下即可,而String对象是实现了Serializable接口的)。
4,如果使用到Nginx的,相关的配置自己去更改,如:
upstream examples {
server localhost:8080;
server localhost:8082;
}
server {
listen 80;
server_name localhost;
location / {
root html;
index index.jsp index.htm;
proxy_pass http://examples;
}
}