SpringBoot利用Redis管理分布式Session

Posted suntp

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot利用Redis管理分布式Session相关的知识,希望对你有一定的参考价值。

https://www.jianshu.com/p/fe9a6c3bda4e

1、添加pom配置

<dependencies>
    <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.session</groupId>
            <artifactId>spring-session-data-redis</artifactId>
        </dependency>
</dependencies>

2、添加yml参数

spring:
  redis:
    cluster:
      nodes: X.X.X.X:6379
    password: XXXXXXXXXXXXXXX
    pool:
      max-active: 8
      max-idle: 8
      max-wait: -1
      min-idle: 0
    timeout: 5000
  session:
    redis:
      namespace: XXXXXXXXXXXXXX

3、添加Redis配置类

@Configuration
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 3600)
public class RedisSessionConfig {

    private static final Logger logger = LoggerFactory.getLogger(RedisSessionConfig.class);

    @Value("${spring.redis.cluster.nodes}")
    private String cluster;

    @Value("${spring.redis.password}")
    private String password;

    public RedisSessionConfig() {
        //redisSession配置类
    }

    @Bean
    public static ConfigureRedisAction configureRedisAction() {
        logger.info("redisconfig配置生效");
        return ConfigureRedisAction.NO_OP;
    }

    @Bean
    public JedisConnectionFactory connectionFactory() {
        JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory(redisClusterConfiguration(), jedisPoolConfig());
        jedisConnectionFactory.setPassword(password);
        jedisConnectionFactory.setUsePool(true);
        jedisConnectionFactory.setTimeout(1800);
        return jedisConnectionFactory;
    }

    /**
     * redis集群配置
     * 配置redis集群的结点及其它一些属性
     *
     * @return
     */
    private RedisClusterConfiguration redisClusterConfiguration() {
        RedisClusterConfiguration redisClusterConfig = new RedisClusterConfiguration();

        redisClusterConfig.setClusterNodes(getClusterNodes());

        redisClusterConfig.setMaxRedirects(3);
        return redisClusterConfig;

    }

    /**
     * JedisPoolConfig 配置
     * <p/>
     * 配置JedisPoolConfig的各项属性
     *
     * @return
     */
    private JedisPoolConfig jedisPoolConfig() {
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
        //连接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true
        jedisPoolConfig.setBlockWhenExhausted(true);

        //是否启用pool的jmx管理功能, 默认true
        jedisPoolConfig.setJmxEnabled(true);

        //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(3600000);

        //最小空闲连接数, 默认0
        jedisPoolConfig.setMinIdle(0);

        //每次逐出检查时 逐出的最大数目 如果为负数就是 : 1/abs(n), 默认3
        jedisPoolConfig.setNumTestsPerEvictionRun(3);

        //对象空闲多久后逐出, 当空闲时间>该值 且 空闲连接>最大空闲数 时直接逐出,不再根据MinEvictableIdleTimeMillis判断  (默认逐出策略)
        jedisPoolConfig.setSoftMinEvictableIdleTimeMillis(3600000);

        //在获取连接的时候检查有效性, 默认false
        jedisPoolConfig.setTestOnBorrow(false);

        //在空闲时检查有效性, 默认false
        jedisPoolConfig.setTestWhileIdle(false);

        //逐出扫描的时间间隔(毫秒) 如果为负数,则不运行逐出线程, 默认-1
        jedisPoolConfig.setTimeBetweenEvictionRunsMillis(-1);
        return jedisPoolConfig;
    }

    /**
     * redis集群节点IP和端口的添加
     * <p/>
     * 节点:RedisNode redisNode = new RedisNode("127.0.0.1",6379);
     *
     * @return redis集群配置
     */
    private Set<RedisNode> getClusterNodes() {
        // 添加redis集群的节点
        logger.info("读取到的redis集群配置为:{}", cluster);
        if (!StringUtils.isBlank(cluster)) {
            Set<RedisNode> clusterNodes = new HashSet<>();
            List<String> nodes = Arrays.asList(cluster.split(","));
            for (String node : nodes) {
                List<String> domainAndPort = Arrays.asList(node.split(":"));
                String domain = domainAndPort.get(0);
                int port = Integer.parseInt(domainAndPort.get(1));
                clusterNodes.add(new RedisNode(domain, port));
            }
            return clusterNodes;
        } else {
            logger.error("redis集群配置为空!");
            return null;
        }
    }
}

4、添加session

request.getSession().setAttribute("user", result);

5、获取session

Object user = request.getSession().getAttribute("user");

 

以上是关于SpringBoot利用Redis管理分布式Session的主要内容,如果未能解决你的问题,请参考以下文章

spring boot 利用redisson实现redis的分布式锁

如何利用redis来进行分布式集群系统的限流设计

SpringBoot项目+Shiro(权限框架)+Redis(缓存)集成

使用Spring Session做分布式会话管理

使用Spring Session做分布式会话管理

使用idea,springboot,springsession,redis实现分布式微服务的session 共享