본문 바로가기
개발

[Redis] 레디스 기본타입(Sets)

by 박연호의 개발 블로그 2024. 2. 12.
redis 공식문서를 보고 정리한 글입니다.

 

 

redis set은 순서가 없고 고유한 문자열의 집합 입니다. key에 중복되지 않은 값들을 넣을 수 있으며 아래의 용도로 사용할 수 있습니다.

- 게시글을 읽은 IP 모음

- 모든 유저에 대한 역할(role)

- 교집합, 합집합 및 차집합과 같은 일반적인 집합 연산

 

member:users라는 key에 user1, user2, user3를 2번 삽입합니다. set은 중복이 없이 때문에 member:users의 값을 확인하면 하나만 존재하는 것을 확인 할 수 있습니다.

> SADD member:users user1 user2 user3
(integer) 3
> SADD member:users user1 user2 user3
(integer) 0
> SMEMBERS member:users
1) "user1"
2) "user2"
3) "user3"

 

key에 존재할 수 있는 값의 개수는 2^32 - 1(4,294,967,295)개 입니다.

 

 add, remove, set에 특정 값이 존재하는지 등의 명령어는 O(1) 시간복잡도를 가지며 배우 효율적입니다. 하지만 수십만개의 값이 존재하는 set를 조회하는 명령어(SMEMBERS)는 주의해야 하며 O(N) 시간복잡도를 가집니다. 

 

sets에서 대용량 데이터, 스트림 데이터를 조회하는 경우 많은 메모리를 사용할 수 있으며, 걱정된다면 Boolm filter or Cuckoo filter를 고려해야 합니다. 


SADD

O(1) : 하나만 삽입하는 경우, O(N) : 여러개를 삽입하는 경우

SADD key member [member ...]

key에 데이터를 삽입합니다. 만약 데이터가 이미 존재하는 경우 무시됩니다. 만약 key가 존재하지 않는경우 set을 만든 후 명령어를 실행합니다.

 

SCARD

O(1)

SCARD key

key에 저장된 데이터의 개수를 반환합니다.

 

 

SDIFF

O(N) : N은 key들에 존재하는 데이터의 개수

SDIFF key [key ...]

첫번째 key와 모든 이후의 key 간의 차이 집합 멤버를 반환합니다.

a : { 1, 2, 3}

b : { 2, 3 }

c : { 3, 4}

SDIFF a b c는 a에서 b,c와 중복되지 않은 값을 반환합니다. a의 1, 2, 3중에 b, c에 존재하지 않은 1을 반환합니다.

> SADD a 1 2 3
(integer) 3
> SADD b 2 3
(integer) 2
> SADD c 3 4
(integer) 2
> SDIFF a b c
1) "1"

 

 

SDIFFSTORE

O(N) : N은 key들에 존재하는 데이터의 개수

SDIFFSTORE destination key [key ...]

SDIFF와 같지만, 차이점은 반환값을 destination에 저장합니다.

 

a : { 1, 2, 3}

b : { 2, 3 }

c : { 3, 4}

SDIFFSTORE d a b c는 a에서 b,c와 중복되지 않은 값을 d에 삽입합니다.

> SADD a 1 2 3
(integer) 3
> SADD b 2 3
(integer) 2
> SADD c 3 4
(integer) 2
> SDIFFSTORE d a b c
(integer) 1
> SMEMBERS d
1) "1"

 

 

SINTER

O(N*M) : 최악의 경우 O(N*M)이며, N은 가장 작은 set의 데이터 개수, M은 set의 개수 

SINTER key [key ...]

첫번째 key와 이후의 key에 공통적으로 존재하는 데이터를 반환합니다.

 

a : { 1, 2, 3}

b : { 3 }

c : { 3, 4, 5}

SINTER a b c는 a중에(기준으로) b, c에 공통으로 존재하는 데이터를 반환합니다.

> SADD a 1 2 3
(integer) 3
> SADD b 3
(integer) 1
> SADD c 3 4 5
(integer) 3
> SINTER a b c
1) "3"

 

 

SINTERCARD

O(N*M) : 최악의 경우 O(N*M)이며, N은 가장 작은 set의 데이터 개수, M은 set의 개수 

SINTERCARD numkeys key [key ...] [LIMIT limit]

SINTER와 동작과 유사하지만, 차이점은 공통으로 존재하는 데이터의 개수를 반환합니다. 여러개의 공통 데이터가 존재하더라도 limit 개수만큼 반환하며, 명령어를 실행도중에 limit에 도달하면 실행을 멈추게 됩니다. limit의 기본값은 0이며 이는 개수 제한이 없습니다.

 

 

SINTERSTORE

O(N*M) : 최악의 경우 O(N*M)이며, N은 가장 작은 set의 데이터 개수, M은 set의 개수 

SINTERSTORE destination key [key ...]

SINTER와 동일하지만 공통으로 존재하는 데이터를 반환하는 대신 destination에 저장합니다.

 

 

SISMEMBER

O(1)

SISMEMBER key member

member가 key에 존재하는지 여부를 확인하며, 존재하면 0, 존재하지 않으면 1을 반환합니다.

 

 

SMEMBERS

O(N) : key에 속한 데이터의 개수

SMEMBERS key

key에 존재하는 모든 데이터를 반환합니다.

 

 

SMISMEMBER

O(N) : N은 member들의 개수

SMISMEMBER key member [member ...]

여러 member 들이 key에 포함되어 있는지 검사합니다.

 

> SADD a 1 2 3 4
(integer) 4
> SMISMEMBER a 1 2 5
1) (integer) 1
2) (integer) 1
3) (integer) 0

 

 

SMOVE

O(1)

SMOVE source destination member

 이 명령어는 atomic하며 member를 source에서 삭제하고, destionation에 삽입합니다. 만약 source가 존재하지 않거나 source에 member가 존재하지 않으면 0을 반환합니다. 만약 destionation에 이미 member가 있다면 source에서 member가 제거만 됩니다.

 

 

SPOP

count가 없으면 O(1), coun가 있으면 O(N)

SPOP key [count]

 count가 존재하지 않는 경우 set에서 하나의 데이터를 반환하고, count가 존재하는 경우 set에서 count개의 데이터를 반환합니다. 반환 후 set에 있는 데이터는 삭제됩니다.

 

여기서 반환되는 데이터는 add된 순서에 상관없이 랜덤입니다.

 

 

SRANDMEMBER

O(1) : count가 없는 경우, O(N) : count가 존재하는 경우

SRANDMEMBER key [count]

set에서 random 데이터를 삭제하지 않고 조회합니다. count가 존재하지 않으면 1개의 random 데이터를 조회하고 count가 존재하면 count의 양수/음수에 따라 다르게 동작합니다.

   - count 양수 : 중복되지 않고 count 개수만큼 조회함

   - count 음수 : 중복을 허락하고 count 개수만큼 조회함.

> sadd set 1 2 3 4 5
(integer) 5
> srandmember set 3
1) "4"
2) "5"
3) "3"
> srandmember set 3
1) "1"
2) "3"
3) "2"
> srandmember set -3
1) "4"
2) "4"
3) "1"
> srandmember set -3
1) "5"
2) "2"
3) "3"

 

 

SREM

O(N), N은 삭제할 데이터의 개수

SREM key member [member ...]

set에서 member를 삭제합니다. 만약 membe가 존재하지 않으면 명령어는 무시됩니다.

 

 

SUNION

O(N), 대상 keys에 존재하는 모든 데이터의 개수

SUNION key [key ...]

sets의 합집합을 반환합니다.

> sadd set1 a b c
(integer) 3
> sadd set2 1 2 3
(integer) 3
> sunion set1 set2
1) "a"
2) "b"
3) "c"
4) "1"
5) "3"
6) "2"

 

 

SUNIONSTORE

O(N), 대상 keys에 존재하는 모든 데이터의 개수

SUNIONSTORE destination key [key ...]

SUNION 명령어와 동일하지만, 결과를 반환하는 것이 아닌 destionation에 저장합니다.