본문 바로가기
Project/SpringBoot

레디스 사용

by 꽃요미 2025. 5. 13.

1. RedisTemplate을 이용한 분산 캐시 ( 키-값 저장소 ) 로 '방 별 인원 수'와 사용자별 입장 방 ID를 관리하여

여러 서버 인스턴스가 동일한 상태를 공유함

 

* 분산 캐시 ( Distributed Cache ) 

 - RedisTemplate<String, String>.opsForValue() :

  - roomId : 123 -> 현재 인원수

  - userId : 456 -> 사용자가 들어가 있는 방 ID

 

// 방 인원 증가
roomPeopleCacheTemplate.opsForValue().increment("roomId:" + roomId);
// 사용자별 방 정보 저장
alreadyInGameUserCacheTemplate.opsForValue().set("userId:" + userId, roomId);

- roomPeopleCacheTemplate : 각 방마다 현재 인원수 관리,

- alreadyInGameUserCacheTemplate : 각 유저마다의 roomId 관리

 

- 여러 노드가 같은 Redis를 참조하므로, 동시성 환경에서 모든 노드가 동일한 방 인원 상태와 사용자 입장 상태를 조회/갱신 가능

 

 

 

2. Redis Pub/Sub ( RedisEventPublisher 의 convertAndSend ) 를 통해 '방 생성' 및 '인원 변경' 이벤트를

발행하고, 모든 인스턴스가 해당 채녈을 구독하도록 하여 실시간 소켓을 적용함

 

* 분산 메세징 ( Distributed Messaging )

  - RedisEventPublisher.convertAndSend(channel, payload) :

  - 방 생성/방 인원 변경 이벤트를 Redis Pub/Sub 채널로 발행

  - 웹소켓 메시지 전송, 대기방 리스트 갱신을 실시간으로 처리함

 

// 최초 방 생성 직후 호출
redisEventPublisher.publishCreatEvent("create-room-channel", roomResponse);

// 유저 입장·퇴장 후 호출
redisEventPublisher.publishChangeCurrentPeople(
    "change-roomList-channel",
    new ChangeCurrentPeopleResponse(roomId, currentCount, System.currentTimeMillis())
);

- publishRoomCreatedEvent : 최초 방 생성 pub/sub 진행,

- publishChangeCurrentOccupancies : 방 생성 후 pub/sub 진행

 

- 각 서버 인스턴스에서 구독하여, WebSocket ( 실시간 소켓 통신 ) 알림 전송 등 후속 처리를 동시 수행

 

 

 

- 사진에 레디스 역할을 조금 더 구체적으로 작성해 보았다.

 

 

* 분산 락