Sets이란?
Redis Sets는 정렬되지 않은 문자열 모음입니다.
SADD 명령은 집합에 새 요소를 추가합니다.
주어진 요소가 이미 존재하는지 테스트, 여러 Sets 간의 교집합, 합집합 또는 차이점 수행 등과 같은 Sets에 대해 여러 다른 작업을 수행하는 것도 가능합니다.
예제
> sadd myset 1 2 3
(integer) 3
> smembers myset
1. 3
2. 1
3. 2
여기에서 세 개의 요소를 Sets에 추가하고 Redis에게 모든 요소를 반환하도록 지시했습니다.
보시다시피 정렬되지 않았습니다.
Redis는 요소 순서 지정에 대한 사용자와의 계약이 없기 때문에 모든 호출에서 임의의 순서로 요소를 반환할 수 있습니다.
Redis에는 멤버십을 테스트하는 명령
요소가 존재 확인 명령어
> sismember myset 3 // 3은 존재
(integer) 1
> sismember myset 30 // 30은 존재 하지 않는다
(integer) 0
Sets을 사용할 때
Sets는 객체 간의 관계를 표현하는 데 좋습니다.
예를 들어 태그를 구현하기 위해 Sets를 쉽게 사용할 수 있습니다.
이 문제를 모델링하는 간단한 방법은 태그를 지정하려는 모든 개체에 대한 집합을 갖는 것입니다.
Sets에는 객체와 연관된 태그의 ID가 포함됩니다.
뉴스 기사에 태그를 지정할 때
기사 news 1000에 태그 1, 2, 5 및 77이 지정된 경우 Sets는 이러한 태그 ID를 뉴스 항목과 연결할 수 있습니다.
> sadd news:1000:tags 1 2 5 77
(integer) 4
반대의 경우(주어진 태그로 태그가 지정된 모든 뉴스 목록)
> sadd tag:1:news 1000
(integer) 1
> sadd tag:2:news 1000
(integer) 1
> sadd tag:5:news 1000
(integer) 1
> sadd tag:77:news 1000
(integer) 1
주어진 객체에 대한 모든 태그를 얻는 것은 간단합니다.
> smembers news:1000:tags
1. 5
2. 1
3. 77
4. 2
참고
이 예에서는 태그 ID를 태그 이름에 매핑하는 Redis 해시와 같은 다른 데이터 구조가 있다고 가정합니다.
올바른 Redis 명령을 사용하여 쉽게 구현할 수 있는 다른 중요하지 않은 작업이 있습니다.
예를 들어 태그 1, 2, 10 및 27이 함께 있는 모든 개체의 목록을 원할 수 있습니다.
서로 다른 Sets 간의 교차를 수행하는 SINTER 명령을 사용하여 이 작업을 수행할 수 있습니다.
> sinter tag:1:news tag:2:news tag:10:news tag:27:news
... results here ...
게다가 교집합 외에도 합집합, 차이, 임의 요소 추출 등을 수행할 수 있습니다.
예를 들어 웹 기반 포커 게임을 구현하기 위해 덱을 Sets로 표현하고 싶을 수 있습니다.
(C)lubs, (D)iamonds, (H)earts, (S)pades에 대해 한 문자 접두어를 사용한다고 상상해 보십시오.
요소를 추출하는 명령은 SPOP이라고 하며 특정 문제를 모델링하는 데 편리합니다.
> sadd deck C1 C2 C3 C4 C5 C6 C7 C8 C9 C10 CJ CQ CK
D1 D2 D3 D4 D5 D6 D7 D8 D9 D10 DJ DQ DK
H1 H2 H3 H4 H5 H6 H7 H8 H9 H10 HJ HQ HK
S1 S2 S3 S4 S5 S6 S7 S8 S9 S10 SJ SQ SK
(integer) 52
이제 각 플레이어에게 5장의 카드를 제공하려고 합니다.
SPOP 명령은 임의의 요소를 제거하여 클라이언트에 반환하므로 이 경우 완벽한 작업입니다.그러나 덱에 대해 직접 호출하면 게임의 다음 플레이에서 카드 덱을 다시 채워야 하는데(일반 적인 Pop을 사용하면 제거 해야한다.) 이는 이상적이지 않을 수 있습니다.
따라서 시작하려면 덱 키에 저장된 Sets를 game:1:deck 키에 복사할 수 있습니다.
이는 일반적으로 여러 Sets 간의 합집합을 수행하고 결과를 다른 Sets에 저장하는 SUNIONSTORE를 사용하여 수행됩니다.
그러나 단일 Sets의 합집합은 그 자체이므로 다음과 같이 덱을 복사할 수 있습니다.
> sunionstore game:1:deck deck // game:1:deck 는 없으므로 생성되고 빈 Sets에 deck가 합집합으로 복사가 되었다.
(integer) 52
위의 규칙의 스토리
- 이제 첫 번째 플레이어에게 5장의 카드를 제공할 준비가 되었습니다.
> spop game:1:deck "C6" > spop game:1:deck "CQ" > spop game:1:deck "D1" > spop game:1:deck "CJ" > spop game:1:deck "SJ"
한 쌍의 잭, 별로...
Sets 내부의 요소 갯 수를 제공하는 set 명령을 소개하기에 좋은 시기입니다.
이것은 종종 집합 이론의 맥락에서 집합의 카디널리티라고 부르므로 Redis 명령을 SCARD라고 합니다.
> scard game:1:deck
(integer) 47
집합에서 요소를 제거하지 않고 임의의 요소를 가져와야 하는 경우 작업에 적합한 SRANDMEMBER 명령이 있습니다.
또한 반복되는 요소와 반복되지 않는 요소를 모두 반환하는 기능이 있습니다.
결론
이 글에서 Sets는 임의의 Value를 정렬이 안되게 저장을 하여 가져오고 합집합을 사용하여 카드게임을 구현 한거라고 보면된다.
또한 라운드 별로 Key를 생성하면 빠르고 좋은 카드게임 기록이 된다고 생각한다.
개발할때 뒤로가기 버튼 느낌?
'DB' 카테고리의 다른 글
DB 격리 수준(ACID > Isolation) (0) | 2023.06.15 |
---|---|
Redis란?_Sorted sets (0) | 2023.04.16 |
Redis 란?_Hash (0) | 2023.04.16 |
Redis 란?_ Automatic creation and removal of keys (0) | 2023.04.16 |
Redis 란?_명령어_brpop (0) | 2023.04.16 |