코인킷에서 사용하는 Redis 기술

Hwangro Lee
Team 코인킷
Published in
5 min readAug 30, 2018

안녕하세요! Team 코인킷에서 서버를 담당하고 있는 Steve입니다.

저희 Team 코인킷은 다양한 기술을 사용하고 있습니다. 그 중 Redis에 대해서 간단하게 설명해보겠습니다.

Redis는 일반적인 데이터베이스와 같이 데이터를 저장하지만 휘발성 메모리인 RAM에 저장하기 때문에 머신을 종료하면 데이터가 삭제 됩니다. 하지만 데이터베이스보다 훨씬 빠르게 읽을 수 있기 때문에 데이터가 자주 변하지 않으면서 많이 쓰이는 데이터를 저장하기 위해 자주 사용됩니다.

이러한 Redis의 특성때문에 많은 시스템에서 Redis와 같은 메모리 데이터베이스를 사용하고 있습니다.

Redis는 단순 데이터 저장 기능외에도 다양한 기능을 제공하고 있는데 그 중 코인킷에서 사용하고 있는 Redis기능을 알아보도록 하겠습니다.

Pub/Sub

  1. 메세지 보내고 받기
  • DB와는 다르게 Redis는 메세지를 주고 받을 수 있는 기능을 제공합니다.
  • Publish로 메세지를 보내고 Subscribe로 메세지를 받습니다.
  • “subscribe channel_name” 명령어로 메세지를 대기하고 있다면 “publish channel_name messages” 로 subscribe 사용자에게 channel을 통해 메세지를 보낼 수 있습니다.
  • Pub/Sub은 메세지를 저장하지 않기 때문에 다시 메세지를 받고 싶다면 publish명령어로 다시 메세지를 보내야합니다.
  • subscribe로 채널을 구독하기
127.0.0.1:6379> subscribe ch01
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "ch01"
3) (integer) 1
  • publish로 채널에 메세지 보내기
127.0.0.1:6379> publish ch01 "hello world"
(integer) 1
  • subscribe로 메세지를 받았을때
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "ch01"
3) (integer) 1
1) "message"
2) "ch01"
3) "hello world"

2. 코인킷이 GCP Pub/Sub이 아닌 Redis Pub/Sub을 사용하는 이유

  • GCP Pub/Sub은 Queue형태로 저장된 데이터를 가저온 후 Queue에서 지워주지 않으면 Queue에 남아 있게되어 수동으로 지워야하는 번거러움이 있습니다.
  • GCP Pub/Sub을 통해 받은 데이터를 처리 후 Queue에서 제거하기 전에 처리된 데이터를 다시 처리할 수도 있는 잠재적 위험성이 있습니다.
  • Queue에 있는 데이터보다 Queue에 넣는 속도가 빠르다면 데이터가 무한정 누적될 수 있습니다.
  • 알람의 경우 빠른 응답 처리와 한번 보낸 메세지를 다시 보내면 안되지 때문에 GCP Pub/Sub 대신 Redis Pub/Sub을 사용하게 되었습니다.

채팅을 구현하기 위해 사용한 Redis 기능

  1. ZADD key score member
  • score와 함께 데이터 추가
  • score에 시간의 timestamp값을 넣어서 채팅데이터 관리
127.0.0.1:6379> zadd CK_Sample 1 "first"
(integer) 1
127.0.0.1:6379> zadd CK_Sample 2 "second"
(integer) 1
127.0.0.1:6379> zadd CK_Sample 3 "third"
(integer) 1

2. ZRANGEBYSCORE key min max

  • score 범위로 데이터 조회
  • 채팅의 더보기 기능을 구현했습니다.
127.0.0.1:6379> zrangebyscore CK_Sample 2 3
1) "second"
2) "third"
127.0.0.1:6379> zrangebyscore CK_Sample 1 2
1) "first"
2) "second"
127.0.0.1:6379> zrangebyscore CK_Sample 1 3
1) "first"
2) "second"
3) "third"
# 모든 데이터 가저오기 -inf: 최소, +inf: 최대
127.0.0.1:6379> zrangebyscore CK_Sample -inf +inf
1) "first"
2) "second"
3) "third"

3. ZCOUNT key min max

  • score 범위로 개수 조회
  • 채팅 개수를 알기 위해 사용되어집니다.
127.0.0.1:6379> zcount CK_Sample 2 3
(integer) 2
127.0.0.1:6379> zcount CK_Sample -inf +inf
(integer) 3

4. ZREMRANGEBYSCORE key min max

  • score 범위로 데이터 삭제
# 최소 1, 최대 1 인 데이터 삭제
127.0.0.1:6379> zremrangebyscore CK_Sample 1 1
(integer) 1
127.0.0.1:6379> zrangebyscore CK_Sample -inf +inf
1) "second"
2) "third"
# 전체 삭제
127.0.0.1:6379> zremrangebyscore CK_Sample -inf +inf
(integer) 2
127.0.0.1:6379> zrangebyscore CK_Sample -inf +inf
(empty list or set)

5. ZREMRANGEBYRANK key start stop

  • 메세지를 start stop을 기준으로 제거합니다
  • timestamp를 사용해서 오래된 채팅내용을 지웁니다.
# 0번째에서 1번째 데이터 제거
127.0.0.1:6379> zremrangebyrank CK_Sample 0 1
(integer) 2
127.0.0.1:6379> zrangebyscore CK_Sample -inf +inf
1) "third"

--

--