Loading...
My Blog 我的工作和学习笔记

Tomcat使用Redis缓存实现分布式Session共享

程序员笔记 2016/01/15 Tomcat , Redis

前置场景描述

    在两台linux服务器上分别安装Tomcat,并且部署相同的WEB应用,通过前置服务器的nginx反向代理,达到这两个Tomcat的负载均衡的目的,实现分布式部署;当发生单点故障或者临时停机,nginx会将用户当前访问的WEB应用切换到其他正常服务器到应用上,这个时候如果session不同步,则会导致用户会话超时,提示再次登录的现象,会给用户产生非常不好的体验。

所以出现了Tocmat Session共享的课题,用于解决session不同步,应用切换时会话超时的问题。

    Tomcat Session共享的实现方式有多种,例如使用memcache、mongodb、redis等,本文主要针对使用redis来实现Tomcat的Session共享。


实际操作步骤

1、访问https://github.com/jcoleman/tomcat-redis-session-manager/releases ,下载"1.2-tomcat-7-java-7.zip"并解压后将项目导入Eclipse,构建成功,并且导出“tomcat-redis-session-manager-1.2-tomcat-7.jar”


2、将如下jar包放到tomcat的lib目录下

tomcat-redis-session-manager-1.2-tomcat-7.jar

commons-pool2-2.2.jar

jedis-2.5.2.jar

tomcat-juli-7.0.27.jar


3、编辑tomcat配置文件context.xml,加入如下内容

    <Valve className="com.radiadesign.catalina.session.RedisSessionHandlerValve" />
    <Manager className="com.radiadesign.catalina.session.RedisSessionManager"
         host="localhost" 
         port="6379" 
         database="0" 
         maxInactiveInterval="60" 
         />


这里使用的是本机默认安装的redis


4、启动tomcat并且访问应用,查看redis缓存内容如下

127.0.0.1:6379> get 33B32CE273EE4375C78B75CD8BE684DA
"\xac\xed\x00\x05sr\x00Ncn.zblink.framework.redis.session.manager.tomcat7.SessionSerializationMetadata\xdea\xb1\n\x9a\xcdn\xff\x03\x00\x01[\x00\x15sessionAttributesHasht\x00\x02[Bxpw\x14\x00\x00\x00\x10V\x1b\x96:\xe1r\x97_m'k\xbb\xca\xeb\x0e\x1axsr\x00\x0ejava.lang.Long;\x8b\xe4\x90\xcc\x8f#\xdf\x02\x00\x01J\x00\x05valuexr\x00\x10java.lang.Number\x86\xac\x95\x1d\x0b\x94\xe0\x8b\x02\x00\x00xp\x00\x00\x01RDC\"\x02sq\x00~\x00\x03\x00\x00\x01RDC\"\x02sr\x00\x11java.lang.Integer\x12\xe2\xa0\xa4\xf7\x81\x878\x02\x00\x01I\x00\x05valuexq\x00~\x00\x04\x00\x00\a\bsr\x00\x11java.lang.Boolean\xcd r\x80\xd5\x9c\xfa\xee\x02\x00\x01Z\x00\x05valuexp\x01q\x00~\x00\nsq\x00~\x00\x03\x00\x00\x01RDC\"\x03t\x00 33B32CE273EE4375C78B75CD8BE684DAsq\x00~\x00\a\x00\x00\x00\x01t\x00\x15justForSessionTestKeyq\x00~\x00\x0ew\b\x00\x00\x01RDC\"\x02"
127.0.0.1:6379>


参考文档:

https://github.com/jcoleman/tomcat-redis-session-manager

Redis常用命令速查

程序员笔记 2016/01/06 Redis

CentOS 6.7上安装Redis 3.0.5

数据存储篇 2015/12/18 CentOS , Linux , Redis

在CentOS 6.7上安装Redis 3.0.5

#Redis是什么?

Redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。


#wget获取安装包并且安装

[root@centos1 data] wget http://download.redis.io/releases/redis-3.0.5.tar.gz

[root@centos1 data] tar xzf redis-3.0.5.tar.gz

[root@centos1 data] cd redis-3.0.5

[root@centos1 date] make


#安装过程中遇到的问题

1、提示没有“CC”编译器,于是安装“GCC”编译器

[root@centos1 date] yum install gcc

[root@centos1 date] make


2、提示“File `Makefile' has modification time 1.8e+06 s in the future”,将系统时间改为当前时间即可

[root@centos1 date] date -s "2015-11-08 15:15:00"

[root@centos1 date] make


3、提示“Newer version of jemalloc required”,“Leaving directory `/data/redis-3.0.5/src'”

[root@centos1 date] cd src

[root@centos1 src]  make MALLOC=libc


#启动服务并且使用内置客户端测试

[root@centos1 date] src/redis-server

......

359:M 08 Nov 15:28:30.429 * The server is now ready to accept connections on port 6379

说明启动成功,默认端口是:6379


[root@centos1 date] src/redis-cli

redis> set foo bar

OK

redis> get foo

"bar"


#结语

Redis的默认安装比较简单,默认安装启动没有在后台运行;指定配置文件启动可以配置为后台运行,IP、端口、主从配置、安全配置等等


#指定配置文件启动

redis-3.0.5根目录有一个配置文件example,将后台运行打开

[root@centos1 date] vi /data/redis-3.0.5/redis.conf


# By default Redis does not run as a daemon. Use 'yes' if you need it.

# Note that Redis will write a pid file in /var/run/redis.pid when daemonized.

daemonize yes


指定配置文件开启服务

[root@centos1 date] src/redis-server /data/redis-3.0.5/redis.conf




参考文档

http://redis.io/

https://github.com/cinience/RedisStudio/releases

http://www.cnblogs.com/shanyou/archive/2012/01/28/2330451.html