ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 쿠폰 발급을 위한 Redis Set Document 읽기
    프로젝트/선착순 쿠폰 발급 시스템 2023. 5. 6. 00:01
    반응형

    개요

    목표는 1000개의 쿠폰을 미리 만들어두는 것이 목표입니다.

    첫 번째로 RDB와 Redis 중 어떤 DB를 사용할지 고민했습니다.

    레디스는 인메모리 DB이며 싱글스레드이기 때문에 성능과 동시성을 고려하여 레디스를 사용해보고자 합니다.

    여기서 Set을 활용하여 미리 1000개의 쿠폰을 구성해 두고 pop 하면서 해결해보고자 하며 이를 위해 문서를 읽어보고자 합니다.

     

     

    Redis Sets

    Redis Set은 정렬되지 않은 고유한 문자들로 구성되어 있습니다.

     

    예를 들어 user 123과 user 456이 좋아하는 책의 아이디를 set에 저장할 수 있습니다.

    > SADD user:123:favorites 347
    (integer) 1
    > SADD user:123:favorites 561
    (integer) 1
    > SADD user:123:favorites 742
    (integer) 1
    > SADD user:456:favorites 561
    (integer) 1

     

    다음과 같이 user 123이 742번 책과 299번 책을 좋아하는지 확인할 수 있습니다.

    > SISMEMBER user:123:favorites 742
    (integer) 1 //set에 존재o
    > SISMEMBER user:123:favorites 299
    (integer) 0 //set에 존재x

     

    다음과 같이 user 123과 user 456이 같이 좋아하는 책을 알아낼 수 있습니다.

    > SINTER user:123:favorites user:456:favorites
    1) "561"

     

    다음과 같이 user 123이 좋아하는 책의 개수를 알아낼 수 있습니다.

    > SCARD user:123:favorites
    (integer) 3

     

    Redis Set이 지원하는 연산들

    SADD 

    redis> SADD myset "Hello"
    (integer) 1
    redis> SADD myset "World"
    (integer) 1
    redis> SADD myset "World"
    (integer) 0
    redis> SMEMBERS myset
    1) "Hello"
    2) "World"
    redis>

    key에 맴버를 추가하는 연산으로 O(1)의 시간복잡도를 가집니다.

    반환값은 추가된 요소의 수를 의미합니다.

     

    SCARD

    redis> SADD myset "Hello"
    (integer) 1
    redis> SADD myset "World"
    (integer) 1
    redis> SCARD myset
    (integer) 2
    redis>

    key가 존재하지 않으면 0을 반환하고, 그렇지 않다면 존재하는 구성원들의 수를 반환합니다.

    O(1)의 시간복잡도를 가집니다.

     

    SPOP

    redis> SADD myset "one"
    (integer) 1
    redis> SADD myset "two"
    (integer) 1
    redis> SADD myset "three"
    (integer) 1
    redis> SPOP myset
    "two"
    redis> SMEMBERS myset
    1) "one"
    2) "three"
    redis> SADD myset "four"
    (integer) 1

    키의 설정 값 저장소에서 하나 이상의 임의 멤버를 제거하고 반환합니다.

    O(1)의 시간복잡도를 가집니다.

     

    성능

    대부분의 set에 구성원을 더하거나 삭제 확인하는 경우의 시간복잡도는 O(1)입니다.

    하지만 SMEMBERS 연산의 경우 O(N)의 시간복잡도를 가지므로 사용 시 주의해야 합니다.

     

     

     

     

     

    참고자료

    https://redis.io/docs/data-types/tutorial/

     

    Redis data types tutorial

    Learning the basic Redis data types and how to use them

    redis.io

     

    댓글

Designed by Tistory.