Redis解决session共享

redis服务器192.168.50.140上搭建redisredis默认端口为6379

Redis搭建:

redis依赖gcc,先安装:

1

yum install -y gcc-c++

下载redis,我使用的是redis-3.2.1.tar.gz,上传至linux /usr/local/redis-src/中,解压

进入解压后目录redis-3.2.1,执行make命令进行编译

安装到目录/usr/local/redis

执行:

1

make PREFIX=/usr/local/redis install

安装完成之后将redis配置文件拷贝到安装目录下,redis.confredis的配置文件,redis.confredis源码目录,port默认6379

执行命令:

1

cp /usr/local/redis-src/redis-3.2.1/redis.conf /usr/local/redis/

redis安装目录启动和关闭redis

启动:

1

./bin/redis-server ./redis.conf



 

这种启动方式叫做前端启动,必须保持在当前窗口,如果ctrl + c 退出,那么redis也就退出了,不建议使用

那么后端启动:

首先修改redis.confdaemonize的值,打开可以看到默认是no,修改为daemonize yes,启动即可。也可以在该配置文件中修改redis默认端口6379为其他值。



 

关闭redis

1

./bin/redis-cli shutdown

 

 至此,redis服务器搭建完成。

 

 tomcatredis集成实现session共享:

环境为tomcat7 + jdk1.6的话:

所有需要共享session的服务器的tomcat中目录下:

lib目录中添加以下五个jar包,注意版本最好一致,不然极容易出现错误,下边的测试是可用的:



 

conf目录中content.xml中加入:配置redis服务

1

2

3

4

5

6

<Valve className="com.radiadesign.catalina.session.RedisSessionHandlerValve"/> 

<Manager className="com.radiadesign.catalina.session.RedisSessionManager"

host="192.168.50.140"

port="6379"

database="0"  

maxInactiveInterval="60" />

 

环境为tomcat7 + jdk1.71.8的话:

所有需要共享session的服务器的tomcat中目录下:

lib目录中添加以下三个jar包,测试通过:



 

conf目录中content.xml中加入:配置redis服务

1

2

3

4

5

6

<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />       

<Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"

host="192.168.50.140"  

port="6379"  

database="0"              

maxInactiveInterval="60"/>

 

根据我这测试,是jkd1.8+tomcat7,在137139两台tomcat中加入jar包且进行如上配置:

上传jar



 

 修改content.xml



 

启动redis服务,重新启动所有tomcat,启动nginx,刷新nginx页面,两台tomcat页面可以看到sessionid值不变,关闭某台tomcatnginxsessionid不变,说明session是共享的。

问题:

注意开通防火墙6379端口

有可能此时访问会报错,redis无法访问,这是由于redis的安全机制,默认只有127.0.0.1才能访问,在redis.conf中可以找到bind 127.0.0.1,你可以将此ip改为访问者ip

如果有多个访问者,也可以把bind 127.0.0.1注释掉,然后在配置文件中找到protected-mode,修改protected-mode yes改为protected-mode no 关闭redis保护模式即可

详细可以参考这:http://www.cnblogs.com/liusxg/p/5712493.html

 

经过大牛指点:添加两个注意点:

1.按照如上配置,使用redis数据库,放入session中的对象必须要实现java.io.Serializable接口,使用memcache的可以不用实现Serializable接口

原因是:因为tomcat里使用的将session放置redis使用的工具类,是使用的jdk序列化模式存储的,这一点也是很容易理解的,session.setAttribute(String key, Object value),存储Object类型

object放入redis中又要能取出来,只能是序列化进行存储了,然后取出的时候进行反序列化。

所以我们在session中存储的任何对象,都必须实现序列化接口。

2.按照如上配置,使用redissession存储空间时,web应用的session-time的时间单位会变成[],而不是原本的[]

原因是:因为tomcat里使用的将session放置redis使用的工具类,在存储时为对tomcat容器时间做转换,

redis中设置过期时间是使用秒作为单位的,有个命令叫expire可以设置redis键值过期时间,所以在context.xml配置文件中我们需要制定session过期时间(默认是60秒,配成180030分钟),这一点很重要。

 

请注意!!!!

context.xml配置说明:

1

2

3

4

5

6

7

8

9

10

<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />      

<Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"

//这里是redis服务器地址

host="192.168.50.140"

//这里是redis端口,redis默认端口是6379

port="6379"

//这里是redis数据库中的标识,标识第0个,默认使用0即可

database="0"            

//需要注意的是这里由于redis过期时间默认设置为60,单位是秒,session过期时间为30分钟,所以需要设置为1800对应30分钟

maxInactiveInterval="1800"/>

猜你喜欢

转载自lyl-zsu.iteye.com/blog/2408292
今日推荐