1. 程式人生 > >管理spring session存入redis叢集的配置

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


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;
    }
}