Skip to content

Redis에 대하여

sukstar76 edited this page Dec 19, 2020 · 3 revisions

REDIS

레디스란 무엇인가??

  • NOSQL 데이터베이스
  • key-value 데이터베이스
  • in-Memory
    • 데이터가 메모리에 상주
    • 빠르게 쓰고 읽을 수 있다.

레디스의 용도

  • db
  • message queue(pub/sub)
  • shared memory

레디스의 데이터 구조

레디스 Hash

key, field, value 로 구성

key - key field - sub key value - value

레디스를 사용해야 하는 이유

속도

write, read 가 실시간으로 이루어지기 때문에 속도가 빠른 redis가 필요

hash 구조

hash 구조를 이용해서 공연별 회차별 좌석 상태를 쉽게 쓰고 읽을 수 있다.

ex) concertId:seatId:seatStatus 로 저장 하면 쉽게 관리 할 수 있다.

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