Springboot Redis

배세훈·2021년 9월 13일
0

Session

목록 보기
2/3

Springboot Redis 세션 클러스터링

레디스를 이용한 세션 클러스터링의 구성도

  • 웹서버에 자주 이용되는 부하 분산 클러스터 구성이다. 흔히 웹서버에 접근할 때, 클라이언트는 직접적으로 웹서버에 접근하는 것이 아니라 로드밸런서 L4 장비를 통해서 VIP 로 접속해서 각 서버로 로드밸런싱된다.
  • server1에서 사용하는 session이 있다면 server2와 동기화가 이루어져야 한다. 이를 위해 세션클러스터링이 필요하고 그에 따라 필요한 저장소로 레디스를 이용하는 것이다.
  • 세션 클러스터링이란 물리적으로 분리되어있지만 논리적으로 하나로 묶여있는 상태의 세션이고 동일 세션으로 서비스 내의 세션을 관리함을 말한다.

Redis 설치 및 서비스 등록

https://github.com/microsoftarchive/redis/releases 해당 링크에서 zip 파일을 받아서 conf 파일을 각자의 설정에 맞게 수정 후 서비스로 등록 후 시작해주면 된다.

기본포트는 6379번이고 포트를 포함한 설정정보를 수정하려면 redis.windows.conf 파일을 수정하면 된다.

서비스를 등록하고 redis 서비스를 시작한다.

redis-server --service-install redis.windows.conf --loglevel verbose
redis-server --service-start

cli로 접속하여 정상적으로 접속이 되는지 확인(아직 springboot에 redis 설정을 하지 않았으므로 아무것도 없다)

redis-cli

127.0.0.1:6379>
127.0.0.1:6379> keys *
(empty list or set)

  • flushall: 모든 세션 정보 초기화
  • keys *: 모든 세션 정보 조회
  • get "key": 해당 키의 세션 정보 조회

build.gradle 설정

  • redis session을 사용 할 수 있도록 디펜던시 추가

compile('org.springframework.session:spring-session-data-redis)

@EnableRedisHttpSession 설정

  • maxInactiveIntervalInSeconds는 세션만료시간이고 초단위이다. 레디스 내 저장될때는 밀리세컨드 단위로 들어간다. 아래의 코드는 60초이기 때문에 60000밀리세컨드이다.
@Configuration
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 60)
public class RedisHttpSessionConfiguration extends AbstractHttpSessionApplicationInitializer {
	
    public RedisHttpSesfgsionConfiguration(){
    	super(RedisHttpSessionConfiguration.class);
    }
    
    @Value("${spring.redis.host}")
    private String host;
    
    @Value("${spring.redis.port}")
    private Integer port;
    
    @Value("${spring.redis.password}")
    private String password;
    
    @Autowired
    private ObjectMapper mapper;
    
    @Bean
    public RedisConnectionFactory lettuceConnectionFactory(){
    	RedisStandaloneConfiguration standaloneConfiguration = new RedisStandaloneConfiguration(host, port);
        standaloneConfiguration.setPassword(password.isEmpty() ? RedisPassword.none() : RedisPassword.of(password));
        return new LettuceConnectionFactory(standaloneConfiguration);
    }
    
    @Bean
    public RedisTemplate<String, Object> redisTemplate(){
    	RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(lettuceConnectionFactory());
        redisTemplate.setEnableTransactionSupport(true);
        
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer(mapper));
        
        redisTemplate.afterPropertiesSet();
        
        return redisTemplate;
    }
    
    
}

yml 등록

spring:
	redis:
    	host: localhost
        port: 6379
        password: ''
    session:
    	store-type: redis
        redis:
        	flush-mode: on_save

스프링 레디스 세션 타임 요약

  • 스프링 레디스 세션을 이용할때 세션데이터를 레디스에 저장한다.
  • 세션에 대한 만료시간을 30분(1800초)로 설정하면, 세션만료키 (spring:session:session:expires:{session-id})의 만료시간에 1800000 millisecond가 설정된다.
  • 30분(1800초) + 5분(300초) = 2100000 millisecond가 세션키(spring:session:sessions:{session-id})의 만료시간에 설정된다.
  • 세션의 만료시간에 차이가 있는 이유는 세션만료키 값을 설정한 30분이내에 삭제하는 그 순간에도 세션의 세부정보가 필요하다. (세션에 접근할 일이 그 찰나에도 존재할 수 있기 때문) 그렇기 때문에 5분의 추가시간이 더해진 것이다.
  • (앱에서 설정한 만료시간)은 레디스가 세션만료키를 만료하는 시간: 앱에서는 해당 값을 가지고 세션 유무 확인
  • (앱에서 설정한 만료시간 + 5분)은 레디스가 세션키를 만료하는 시간
profile
성장형 인간

0개의 댓글