在redis服务器192.168.50.140上搭建redis,redis默认端口为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.conf是redis的配置文件,redis.conf在redis源码目录,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.conf中daemonize的值,打开可以看到默认是no,修改为daemonize yes,启动即可。也可以在该配置文件中修改redis默认端口6379为其他值。
关闭redis:
1 |
./bin/redis-cli shutdown |
至此,redis服务器搭建完成。
tomcat与redis集成实现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.7或1.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,在137和139两台tomcat中加入jar包且进行如上配置:
上传jar包
修改content.xml
启动redis服务,重新启动所有tomcat,启动nginx,刷新nginx页面,两台tomcat页面可以看到sessionid值不变,关闭某台tomcat,nginx中sessionid不变,说明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.按照如上配置,使用redis做session存储空间时,web应用的session-time的时间单位会变成[秒],而不是原本的[分]
原因是:因为tomcat里使用的将session放置redis使用的工具类,在存储时为对tomcat容器时间做转换,
在redis中设置过期时间是使用秒作为单位的,有个命令叫expire可以设置redis键值过期时间,所以在context.xml配置文件中我们需要制定session过期时间(默认是60秒,配成1800即30分钟),这一点很重要。
请注意!!!!
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"/> |