管理spring session存入redis集群的配置

时间:2022-05-30 20:37:07

最近项目需要集成spring session,我也找了不少资料,其实关于spring session存入redis的配置,网上也有不少相关资料,最标准的莫过于官方文档给出的配置方法,这是地址:

http://docs.spring.io/spring-session/docs/current/reference/html5/#httpsession-redis

给出了JAVA类配置以及XML配置两种方式,但是这两种方式都是最赤裸的,可以根据自己需要进行修改。

我这里需要用到的是redis集群,而不是一个单一的redis,所以配置方式自然要加点东西。

为了测试,也为方便我在windows系统下搭建了个redis集群的环境,这里是某个网友的博客关于windows下搭建redis集群,步骤很清晰,当然我在其中做某些操作的时候,还是遇到了一点问题,但是依然可以作一个参考,这是链接:

http://www.jianshu.com/p/22af55518f6d


关于其中配置源的时候,我这里遇到问题,他们给的问题也尚不能用,我用的是这个源:

使用基于腾讯云的
C:\Users\dong>gem sources -a http://gems.ruby-china.org/
http://gems.ruby-china.org/ added to sources



我说下我的环境,win10,eclipse,maven工程,redis3.0,下面是依赖的库:

<!-- spring session用到的库begin -->
    <dependency>
      <groupId>org.springframework.session</groupId>
      <artifactId>spring-session-data-redis</artifactId>
      <version>1.2.1.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>redis.clients</groupId>
      <artifactId>jedis</artifactId>
      <version>2.8.1</version>
    </dependency>
    <!-- end -->

直接贴我配置好的代码:

SpringSessionConfig.java


package com.cmos.itframe.web.config;

import java.util.HashSet;
import java.util.Set;

import org.springframework.context.annotation.Bean;
import org.springframework.data.redis.connection.RedisClusterConfiguration;
import org.springframework.data.redis.connection.RedisNode;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;

import redis.clients.jedis.JedisPoolConfig;

/**
 * RedisHttpSessionConfiguration的配置文件
 *
 * 引入RedisHttpSessionConfiguration.class
 *
 * maxInactiveIntervalInSeconds设置session在redis里的超时
 *
 * @author dong
 *
 */
@EnableRedisHttpSession(maxInactiveIntervalInSeconds=1000)
public class SpringSessionConfig {

    @Bean
    public JedisConnectionFactory connectionFactory() {
        JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory(redisClusterConfiguration(),jedisPoolConfig());
        
        jedisConnectionFactory.setUsePool(true);
        jedisConnectionFactory.setTimeout(2000);
        
        return jedisConnectionFactory;
    }
    
    /**
     * redis集群配置
     *
     * 配置redis集群的结点及其它一些属性
     *
     * @return
     */
    private RedisClusterConfiguration redisClusterConfiguration(){
        RedisClusterConfiguration redisClusterConfig = new RedisClusterConfiguration();

        redisClusterConfig.setClusterNodes(getClusterNodes());
        
        redisClusterConfig.setMaxRedirects(3);
        return redisClusterConfig;
        
    }
    
    /**
     * JedisPoolConfig 配置
     *
     * 配置JedisPoolConfig的各项属性
     *
     * @return
     */
    private JedisPoolConfig jedisPoolConfig(){
        JedisPoolConfig jedisPoolConfig= new JedisPoolConfig();
        //连接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true
        jedisPoolConfig.setBlockWhenExhausted(true);
        
        //是否启用pool的jmx管理功能, 默认true
        jedisPoolConfig.setJmxEnabled(true);
        
        //默认就好
        //jedisPoolConfig.setJmxNamePrefix("pool");
        
        //jedis调用returnObject方法时,是否进行有效检查
        jedisPoolConfig.setTestOnReturn(true);
        
        //是否启用后进先出, 默认true
        jedisPoolConfig.setLifo(true);
        
        //最大空闲连接数, 默认8个
        jedisPoolConfig.setMaxIdle(8);
        
        //最大连接数, 默认8个
        jedisPoolConfig.setMaxTotal(8);
        
        //获取连接时的最大等待毫秒数(如果设置为阻塞时BlockWhenExhausted),如果超时就抛异常, 小于零:阻塞不确定的时间,  默认-1
        jedisPoolConfig.setMaxWaitMillis(-1);
        
        //逐出连接的最小空闲时间 默认1800000毫秒(30分钟)
        jedisPoolConfig.setMinEvictableIdleTimeMillis(1800000);
        
        //最小空闲连接数, 默认0
        jedisPoolConfig.setMinIdle(0);
        
        //每次逐出检查时 逐出的最大数目 如果为负数就是 : 1/abs(n), 默认3
        jedisPoolConfig.setNumTestsPerEvictionRun(3);
        
        //对象空闲多久后逐出, 当空闲时间>该值 且 空闲连接>最大空闲数 时直接逐出,不再根据MinEvictableIdleTimeMillis判断  (默认逐出策略)  
        jedisPoolConfig.setSoftMinEvictableIdleTimeMillis(1800000);
        
        //在获取连接的时候检查有效性, 默认false
        jedisPoolConfig.setTestOnBorrow(false);
        
        //在空闲时检查有效性, 默认false
        jedisPoolConfig.setTestWhileIdle(false);
        
        //逐出扫描的时间间隔(毫秒) 如果为负数,则不运行逐出线程, 默认-1
        jedisPoolConfig.setTimeBetweenEvictionRunsMillis(-1);
        
        return jedisPoolConfig;
    }
    
    /**
     * redis集群节点IP和端口的添加
     *
     * 节点:RedisNode redisNode = new RedisNode("127.0.0.1",6379);
     *
     * @return
     */
    private Set<RedisNode> getClusterNodes(){
        // 添加redis集群的节点
        Set<RedisNode> clusterNodes = new HashSet<RedisNode>();
        // 这三个主节点是我本机的IP和端口,从节点没有加入 ,这里不是我真实的IP,虽然是内网,还是不要太直接了
        clusterNodes.add(new RedisNode("192.168.1.1", 6380));
        clusterNodes.add(new RedisNode("192.168.1.1", 6381));
        clusterNodes.add(new RedisNode("192.168.1.1", 6382));
        return clusterNodes;
    }
}

关于JedisPoolConfig的各属性的说明,是参考的这位网友的博客说明,这是链接:

http://www.cnblogs.com/tankaixiong/p/4048167.html


HttpSessionApplicationInitializer.java

package com.cmos.itframe.web.config;

import org.springframework.session.web.context.AbstractHttpSessionApplicationInitializer;

/**
 *
 * 加载RedisHttpSessionConfiguration配置文件
 * 定义springSessionRepositoryFilter拦截所有的请求将session封装为spring session
 *
 * @author dong
 *
 */
public class HttpSessionApplicationInitializer extends AbstractHttpSessionApplicationInitializer {

    public HttpSessionApplicationInitializer() {
        super(SpringSessionConfig.class);
    }

}

总共需要这两个文件即可完成配置,每个人的情况自然不同配置也就不一样,这个只是我的,只是希望有朋友在需要的时候,做个参考,可以少走不少弯路。