Skip to content

REDIS 를 이용한 실시간 DATA 관리

sukstar76 edited this page Dec 18, 2020 · 8 revisions

REDIS WATCH 를 이용한 동시 클릭 방지

REDIS TRANSACTION

Redis 에서 MULTI, EXEC, DISCARD, WATCH 는 Transaction 의 기반이 되는 Command 들이다.

이들은 command 들을 그룹 단위로 실행할 수 가 있다.

Transaction 에서 모든 Command 들은 순차화되어 순서대로 실행된다.

다른 사용자의 요청은 기존에 실행되고 있던 Redis transaction 중간에 실행될 수 없다.

즉, Redis 에서 Transaction 은 단일 isolated 작업으로써 실행된다는 점이 보장된다.

Redis transaction 은 모든 Command 들을 처리 또는 수행하지 않음으로써 Atomic 을 보장한다.

EXEC Command 는 Transaction 의 실행 시작을 의미한다. client 가 MULTI Command 를 호출하기 이전에 서버에 대한 연결이 끊어지면 Transaction context 내의 작업들이 하나도 수행되지 않는다.

대신 EXEC Command 가 호출이 된다면, 모든 작업들은 수행된다. append-only 파일을 사용할 때 Redis 는 단일 write 시스템 호출을 사용하여 디스크에 Transaction 을 기록한다.

그러나 Redis server 가 고장나거나 system 관리자에 의해 종료되는 발생하기 힘든 경우가 일어났을 때에는 일부 작업들만이 기록될 수도 있다.

Redis 는 재시작할 때에 이러한 비정상적인 상황들을 감지하고, error 와 함께 종료된다.

redis-check-aof tool 을 사용하면 server 가 다시 시작될 수 있도록 부분적으로 기록된 작업들을 지움으로써 error 상황을 해결할 수 있다.

REDIS WATCH

WATCH 된 키는 변경 사항을 감지하기 위해 모니터 된다.

EXEC 명령 전에 하나 이상의 감시 키가 수정되면 전체 트랜잭션이 중단되고

EXEC 는 트랜잭션이 실패했음을 알리기 위해 Null 응답을 반환합니다.

client.watch("anyKey")
client.multi().set("anyKey", "anyValue").exec() // ->[[Error|null, any]]

이렇게 작성하여 테스팅 했을 때 동시에 접근 했을 때 watch를 통해 방지를 할 수 있었다.

redis transaction 에 좋은 글을 보고 싶으면,

Redis Transaction

참고하자!

REDIS PUB / SUB 을 이용한 좌석 취소

REDIS PUB / SUB

Redis Server 에 연결된 Redis Client 들이 Channel 을 통해 메세지를 주고 받을 수 있는 기능

Ex) Client A 가 Channel AB 에 message Publish -> Client B 는 Channel AB 를 Subscribe 통해 message 받을 수 있음

REDIS EXPIRE

Redis 에서는 key 에 만료 시간을 설정할 수 있다.

또한, Redis 에서는 key event에 대해 message 를 날리는 config 가 있고,

이 message 는 채널을 구독해 수신 받을 수 있다

만료 채널은 keyevent@:expired 이다.

좌석 취소

위에 언급한 2가지의 레디스 기능을 통해 만료를 걸고 이벤트를 수신해보자

redis.config("SET", "notify-keyspace-events", "Ex");

위의 코드처럼 redis가 key 만료에 관한 메세지를 날리게 설정한다.

그리고 redis를 채널의 패턴을 통해 채널을 구독할 수 있다.

redis.psubscribe("__key*__:*");
 redis.on("pmessage", (pattern: any, channel: any, message: string) => {
   console.log(pattern, channel, message)
   // __key*__:, *__keyevent@<db>__:expired, keyName
  });

위와 같이 패턴을 구독한 채널에게 메세지를 받을 수 있으며, message 로 만료된 key를 받을 수 있다!

이 key를 분해하여, 좌석을 선택한 사용자에게 소켓 이벤트를 날려 줄 수 있다.

추가 정보 redis의 key 만료 처리 방법

Clone this wiki locally