>데이터 베이스 >Redis >Redis가 세션 공유를 구현하는 방법은 무엇입니까?

Redis가 세션 공유를 구현하는 방법은 무엇입니까?

PHPz
PHPz앞으로
2023-05-30 13:28:062129검색

소개

다창의 많은 프로젝트는 여러 지역에 존재합니다. 서비스에 접속할 때 동일한 서비스가 실행되더라도 다른 서버에서 실행될 수 있습니다. 프로젝트에서 다음과 같은 세 개의 서버가 있다고 가정합니다(그림 참조). 세션을 사용하여 사용자의 로그인 정보를 저장하는 데 사용할 수 있습니다.

Redis가 세션 공유를 구현하는 방법은 무엇입니까? 이 로그인이 Server 01을 통해 실행된다고 가정하면 이번 로그인 세션 정보는 메모리 01에 저장되지만 다시 방문하면 서버 02가 작업을 수행하지만 로그인 세션 정보는 메모리 01에 있습니다. server 02에서는 얻을 수 없으니 로그인이 안된 것으로 판단해서 잘못된 정보를 돌려주게 되는데...

우리가 이루고 싶은 것은 한 서버에 로그인하여 생성된 세션을 다른 서버와 공유할 수 있다는 것입니다

, 그럼 어떻게 달성할 수 있나요?

해결 방법

이러한 서버의 메모리는 공유할 수 없으므로 이러한 서버가 함께 액세스할 수 있는 공유 공간이면 충분하다는 것입니다(그림 참조).

첫 번째 생각나는 것은 데이터베이스입니다. 이러한 서버 클러스터가 데이터베이스를 공유하고 생성된 세션 정보를 데이터베이스에 저장하는 한, 관계형 데이터베이스와 비관계형 데이터베이스(NoSql)가 있습니다. Redis가 세션 공유를 구현하는 방법은 무엇입니까?

관계형 데이터베이스: Mysql 등
  • 비관계형 데이터베이스: Redis(K/V 데이터베이스) 등
  • 사실 여기서는 Redis 기반이기 때문에 비관계형 데이터베이스를 선택하는 것이 가장 좋습니다. 메모리에 있고 읽기 및 쓰기 성능이 높으므로 이러한 유형의 사용자에게 매우 적합합니다.
여기서는 소개하지 않지만 파일 서버를 통해서도 구현할 수 있습니다. 이 방법은 매우 간단하지만 위의 두 가지와는 개념이 다릅니다. 즉, 동일한 IP에 대한 모든 요청은 nginx에 의해 계산되고 결과는 바인딩됩니다. 그 후 이 요청은 서버에 액세스합니다.

그러나 여기에는 몇 가지 문제가 있습니다. 우선 로드 밸런싱이 별 의미가 없습니다. 바인딩된 서버가 중단되면 iphash가 유효하지 않거나 귀하의 요청이 다른 서비스에 의해 배포되어 nginx 서비스를 거치지 않습니다. . 그러면 iphash도 적용되지 않으므로 주의해서 사용하세요.

이제 Redis 구성을 통해 세션 공유를 쉽게 달성하는 방법을 간단하게 시뮬레이션하겠습니다.

사례 소개

여기에 사용자 관리 프로젝트가 있습니다. 로그인할 때 코드가 기록됩니다. 사용자 세션 정보:

그러면 프로젝트의 두 서비스가 동시에 열립니다: localhost:8080 및 localhost:8082 (두 개의 다른 서버에서 실행되는 프로젝트로 간주할 수 있음)

Redis가 세션 공유를 구현하는 방법은 무엇입니까?

서비스 개시 후 해당 인터페이스 문서를 방문할 수 있습니다:

Redis가 세션 공유를 구현하는 방법은 무엇입니까?

---------------------------- -------구분선--- -------------------------- -

Redis가 세션 공유를 구현하는 방법은 무엇입니까?

이 서비스를 사용할 수 있습니다. 다음 두 가지 인터페이스: (다음 테스트는 동일한 서비스에서 테스트됩니다.)

로그인 인터페이스: 로그인 사용자 세션 정보 기록 Redis가 세션 공유를 구현하는 방법은 무엇입니까?

로그인 테스트:

Redis가 세션 공유를 구현하는 방법은 무엇입니까?

Get 현재 사용자 정보 인터페이스: 로그인 세션 통과 현재 사용자 정보

Redis가 세션 공유를 구현하는 방법은 무엇입니까?

현재 로그인된 사용자 정보 가져오기 테스트:

Redis가 세션 공유를 구현하는 방법은 무엇입니까?

이 두 가지 서비스이므로 세션을 공유하는 것은 절대 불가능합니다. 포트 8080에서 서비스에 로그인하면 포트 8082에 로그인할 수 없습니다. 서비스는 현재 사용자 정보를 얻습니다. (다시 강조합니다. 위의 테스트는 동일한 서비스에서 테스트되었기 때문에 현재 사용자 정보를 얻을 수 있습니다. 물론 동일한 서비스 세션은 자체 메모리에 저장되어 자체적으로 접근 가능합니다.)

특수한 동작Redis가 세션 공유를 구현하는 방법은 무엇입니까?

다음은 redis 구성을 통해 공유 세션을 구현하는 것입니다.

먼저 Redis를 다운로드하고 온라인으로 튜토리얼을 다운로드합니다. 저는 서버에서 Docker를 통해 생성된 Redis 컨테이너를 직접 사용합니다(간단하고 사용하기 쉬우며 적극 권장).

Redis가 세션 공유를 구현하는 방법은 무엇입니까?

시각화 도구를 통해 연결할 수 있습니다.

Redis가 세션 공유를 구현하는 방법은 무엇입니까?

이렇게 하면 redis가 구성됩니다. 이제 프로젝트 코드에서 redis를 구성합니다.

프로젝트에 redis 종속성과 spring-session 구성 종속성을 도입합니다(redis에 세션을 자동으로 저장합니다):

<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-redis -->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-redis</artifactId>
	<version>2.6.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.session/spring-session-data-redis -->
<dependency>
	<groupId>org.springframework.session</groupId>
	<artifactId>spring-session-data-redis</artifactId>
	<version>2.6.3</version>
</dependency>

application.yml에서 구성합니다. file Redis 및 세션 연결을 위한 관련 구성:

spring:
  # session配置
  session:
    timeout: 86400 # 设置session失效时间
    store-type: redis # 修改spring-session存储配置,默认存储到服务器内存中,现在设置存到redis中(关键)
  # redis配置
  redis:
    port: 8081 # redis的端口号(这里是我的redis容器在docker中对应的端口号)
    host: xx.xxx.xxx.xxx # 我的云服务器ip
    database: 0 # 设置存入redis的哪一个库(默认是0)

실제로 핵심 구성은 하나뿐입니다: store-type: redis 이것이 구성되는 한 코드의 세션은 자체 메모리 대신 Redis에 저장됩니다.

그런 다음 테스트할 수 있습니다:

로그인 인터페이스 호출, 사용자 세션 정보 생성, redis 확인:

Redis가 세션 공유를 구현하는 방법은 무엇입니까?

사용자 로그인 세션이 redis에 저장되어 포트 8080에 로그인할 수 있음을 알 수 있습니다. , 그리고 8082에서 로그인 정보를 얻을 수도 있습니다. 세션 정보:

로그인:

Redis가 세션 공유를 구현하는 방법은 무엇입니까?

정보 가져오기:

Redis가 세션 공유를 구현하는 방법은 무엇입니까?

이러한 방식으로 세션 공유는 redis를 통해 이루어집니다.

참고: 소개된 redis 및 spring-redis 종속성 버전은 가까워야 합니다.

위 내용은 Redis가 세션 공유를 구현하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제