springboot 整合 session+redis 实现分布式共享

这里简单的实现springboot (2.2版本) 通过redis(3.4版本)实现 session的分布式共享,比较简单,代码如下

首先pom文件的代码如下:



   org.springframework.boot
   spring-boot-starter-tomcat
   
   



      
          org.springframework.session
          spring-session-data-redis
      


   org.springframework.boot
   spring-boot-starter-data-redis



   org.springframework.boot
   spring-boot-starter-web



   redis.clients
   jedis
   3.1.0




   org.springframework.boot
   spring-boot-devtools
   true

 

需要说明的是这里通过大war包通过外部的tomcat实现部署,没有使用springboot内置的tomcat。

application的代码很简单就写了一个端口,如下:

server:
  port: 9011

另外单独写了一个redis的属性配置 redis.porperties文件 代码如下:

# Redis数据库索引(默认为0)
spring.redis.database=0
# Redis服务器地址
spring.redis.host=127.0.0.1
# Redis服务器连接端口
spring.redis.port=6379
# Redis服务器连接密码(默认为空)
#spring.redis.password=
# 连接池最大连接数(使用负值表示没有限制)
spring.redis.jedis.pool.max-active=1024
# 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.jedis.pool.max-wait=100000
# 连接池中的最大空闲连接
spring.redis.jedis.pool.max-idle=10
# 连接池中的最小空闲连接
spring.redis.jedis.pool.min-idle=0
# 连接超时时间(毫秒)
spring.redis.timeout=10000
#redis配置结束
spring.redis.block-when-exhausted=true

 

配置文件的代码如下
 

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.*;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import redis.clients.jedis.JedisPool;

import lombok.extern.slf4j.Slf4j;
import redis.clients.jedis.JedisPoolConfig;

@Slf4j
@Configuration
@PropertySource("classpath:redis.properties")
@EnableCaching
public class CachingConfigurer {
 @Value("${spring.redis.host}")
        private String host;

        @Value("${spring.redis.port}")
        private int port;

        @Value("${spring.redis.timeout}")
        private int timeout;

        @Value("${spring.redis.jedis.pool.max-active}")
        private int maxActive;

        @Value("${spring.redis.jedis.pool.max-idle}")
        private int maxIdle;

        @Value("${spring.redis.jedis.pool.min-idle}")
        private int minIdle;

        @Value("${spring.redis.jedis.pool.max-wait}")
        private long maxWaitMillis;

        @Bean
        public JedisPool generateJedisPoolFactory() {
            JedisPoolConfig poolConfig = new JedisPoolConfig();
            poolConfig.setMaxTotal(maxActive);
            poolConfig.setMaxIdle(maxIdle);
            poolConfig.setMinIdle(minIdle);
            poolConfig.setMaxWaitMillis(maxWaitMillis);
            JedisPool jedisPool = new JedisPool(poolConfig, host, port, timeout);
            return jedisPool;
        }

}

测试的controller层的代码如下:

import com.ext.demotwo.common.RedisUtil;
import com.ext.demotwo.common.RedisUtil22;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.HashMap;
import java.util.Map;

@Slf4j
@RestController
public class redisController {

@RequestMapping("/get3")
public String get1(HttpSession session){
    log.info(session.getId());
    return "success";
}

}

因为这里是打war包,所以要在启动类做一些修改代码如下:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;

@SpringBootApplication
public class DemotwoApplication   extends SpringBootServletInitializer {  //打war包 要继承SpringBootServletInitializer 这个类  同时端口号要和tomcat的端口号保持一致

   public static void main(String[] args) {
      SpringApplication.run(DemotwoApplication.class, args);
   }

   /*打war包要加的下面的方法*/
   @Override
   protected SpringApplicationBuilder configure(SpringApplicationBuilder application){
      System.out.println("外部tomcat,chapter启动!");
      return application.sources(DemotwoApplication.class);
   }
}

 

可是设置不同的端口,打两个包放到两个tomcat运行,比如我用的 端口分别是 9010,9011,放在不同的tomcat上面运行,特别要注意,这个时候要把tomcat的端口号要修改 9010,9011和这里的

端口号对应,否则会出错。

实验的结果,sessionid 都是一样的。

欢迎批评指正,2020,11,11 河北邯郸

 

你可能感兴趣的:(springboot,redis,spring,boot,redis)