`

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"/>

 

 

  • 大小: 44.8 KB
  • 大小: 18.3 KB
  • 大小: 8.5 KB
  • 大小: 57.8 KB
  • 大小: 25.5 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics