• Spring-SESSION+Redis 实现Session共享


    Spring-SESSION+Redis 实现Session共享

      通常情况下,Tomcat的Servlet容器会默认将Session保存在内存中。如果是单个服务器实例的应用,将Session保存在服务器内存中是一个常用的选择,但是随着服务器数量的增多,这种方法变得不容易扩展,因此需要进行session共享。

    关于session共享的方式有多种:

    (1)通过nginx的ip_hash,根据ip将请求分配到对应的服务器

    (2)基于关系型数据库存储

    (3)基于cookie存储

    (4)服务器内置的session复制域

    (5)基于nosql(memcache、redis都可以)

      常用的就是1和5,下面研究第5种方式,基于nosql(redis)存储session。

    下边基于springboot进行session共享配置:

    1、pom.xml中引入Redis相关的依赖

            <!--        缓存数据库相关-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-redis</artifactId>
            </dependency>
            <dependency>
                <groupId>redis.clients</groupId>
                <artifactId>jedis</artifactId>
            </dependency>
            <!--spring-session-redis sessiong共享       -->
            <dependency>
                <groupId>org.springframework.session</groupId>
                <artifactId>spring-session-data-redis</artifactId>
            </dependency>    

     2、配置 application.properties

    #配置spring_session共享redis
    #Redis
    spring.redis.host=140.143.XX.XX
    ## Redis服务器连接端口
    spring.redis.port=6379
    ## 连接超时时间(毫秒)
    spring.redis.timeout=300ms
    ## Redis服务器连接密码(默认为空)
    spring.redis.password=ww

     3、设置Redis配置,并开启session缓存

    @EnableRedisHttpSession
    public class RedisSessionConfig {
    
        @Value("${spring.redis.host}")
        private String redisHost;
    
        @Value("${spring.redis.port}")
        private int redisPort;
    
        @Value("${spring.redis.password}")
        private String redisPassword;
    
    
        /**
         * 配置连接工厂
         * @return
         */
        @Bean
        public RedisConnectionFactory redisConnectionFactory() {
            RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration(redisHost, redisPort);
            redisStandaloneConfiguration.setPassword(RedisPassword.of(redisPassword));
            return new JedisConnectionFactory(redisStandaloneConfiguration);
        }
    
    }

    4、编写一个Controller并进行测试

    @RestController
    public class RedisSessionTestController {
    
    
        @RequestMapping(value = "/sessionInsert")
        public  String insert(String key,String value, HttpSession session){
            session.setAttribute(key,value);
            return "success";
        }
    
        @RequestMapping(value = "/sessionGet")
        public  String delete(String key,HttpSession session){
            String value = (String) session.getAttribute(key);
            return key+":"+ value;
        }
    }

    启动两个服务进行测试,端口分别为8000 ,8001,两台服务均可获取到session

     测试结果:

  • 相关阅读:
    C语言修炼-第2天
    static_cast, dynamic_cast, reinterpret_cast, const_cast的区别
    构造函数不能为虚函数的原因
    matlab2016b ubuntu命令行安装 + matconvnet的安装
    python debug open_files
    构造函数不能被继承的原因
    NNVM代码阅读
    ncnn阅读
    Deep TEN: Texture Encoding Network
    git命令笔记
  • 原文地址:https://www.cnblogs.com/pinghengxing/p/12822276.html
Copyright © 2020-2023  润新知