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");

原文地址:https://www.cnblogs.com/suntp/p/11271394.html

时间: 2024-10-10 08:39:23

SpringBoot利用Redis管理分布式Session的相关文章

使用Spring Session和Redis解决分布式Session跨域共享问题

前言 对于分布式使用Nginx+Tomcat实现负载均衡,最常用的均衡算法有IP_Hash.轮训.根据权重.随机等.不管对于哪一种负载均衡算法,由于Nginx对不同的请求分发到某一个Tomcat,Tomcat在运行的时候分别是不同的容器里,因此会出现session不同步或者丢失的问题. 文末分享了我一部分私人收藏 有兴趣的可以收藏看一下的 都是架构师进阶的内容 实际上实现Session共享的方案很多,其中一种常用的就是使用Tomcat.Jetty等服务器提供的Session共享功能,将Sessi

Redis实战和核心原理详解(5)使用Spring Session和Redis解决分布式Session跨域共享问题

Redis实战和核心原理详解(6)使用Spring Session和Redis解决分布式Session跨域共享问题 前言 对于分布式使用Nginx+Tomcat实现负载均衡,最常用的均衡算法有IP_Hash.轮训.根据权重.随机等.不管对于哪一种负载均衡算法,由于Nginx对不同的请求分发到某一个Tomcat,Tomcat在运行的时候分别是不同的容器里,因此会出现session不同步或者丢失的问题. 实际上实现Session共享的方案很多,其中一种常用的就是使用Tomcat.Jetty等服务器提

redis 实现分布式session配置

Redis分布式session配置 如上图,多实例下可以使用redis实现分布式session管理,客户端请求,经过负载均衡分发至tomcat实例,再经过session管理,实现session在redis中存取,这里暂时只有一台redis机器. 具体代码如下: 1.redis配置 可以使用spring-cache.xml作为redis配置文件名,首先配置redis缓存池: <bean id="jedisPoolConfig" class="redis.clients.j

利用redis实现分布式锁 - waen - 博客园

原文:利用redis实现分布式锁 - waen - 博客园 利用数据库触发器实现定期自动增量更新缓存 原文地址:https://www.cnblogs.com/lonelyxmas/p/10434810.html

springboot集成springsession利用redis来实现session共享

转:https://www.cnblogs.com/mengmeng89012/p/5519698.html 这次带来的是spring boot + redis 实现session共享的教程. 在spring boot的文档中,告诉我们添加@EnableRedisHttpSession来开启spring session支持,配置如下: Java代码   @Configuration @EnableRedisHttpSession public class RedisSessionConfig {

基于Redis实现分布式Session

1.概述 我们可以自己实现类似Session的机制,采用 Redis 等分布式缓存中间件来实现. Redis是独立于应用服务器的,基于Redis实现的Session机制自动具备了分布式属性. Redis可以很方便地做集群配置,则Session避免了单点故障. 2.实现 实现代码极其简单,如下所示. /** * @author liuhailong2008#foxmail */ public class ApiSession implements Serializable { private st

[Node.js] Node + Redis 实现分布式Session方案

Session是什么? Session 是面向连接的状态信息,是对 Http 无状态协议的补充. Session 怎么工作? Session 数据保留在服务端,而为了标识具体 Session 信息指向哪个连接,需要客户端传递向服务端发送一个连接标识,比如存在Cookies 中的session_id值(也可以通过URL的QueryString传递),服务端根据这个id 进行存取状态信息. 在服务端存储 Session,可以有很多种方案: 内存存储 数据库存储 分布式缓存存储 分布式Session

Redis学习笔记~StackExchange.Redis实现分布式Session

回到目录 对于多WEB的环境现在已经是必须的了,很难想像一台WEB服务器面对百万并发的响应,所以,我们需要多台WEB服务器集群合作,来缓解这种高并发,高吞吐的场景,而对于多WEB的场景又会有个问题出现,即session存储的问题,如一个用户登陆后,把一个状态信息存储到当前WEB服务器的session里,而你请求其它页面时,很可能就被路由到另一台服务器了,这时,session也就丢了,而对于这种情况,有人把redis这个存储中间件想了起来,对它进行了封装,就有了今天基于redis的session共

利用Redis实现分布式锁

写在最前面 我在之前总结幂等性的时候,写过一种分布式锁的实现,可惜当时没有真正应用过,着实的心虚啊.正好这段时间对这部分实践了一下,也算是对之前填坑了. 分布式锁按照网上的结论,大致分为三种:1.数据库乐观锁: 2.基于Redis的分布式锁:3..基于ZooKeeper的分布式锁: 关于乐观锁的实现其实在之前已经讲的很清楚了,有兴趣的移步:使用mysql乐观锁解决并发问题 .今天先简单总结下redis的实现方法,后面详细研究过ZooKeeper的实现原理后再具体说说ZooKeeper的实现. 为