Redis 시작하기 - Set
Sets
Redis 집합은 순서가 지정되지 않은 문자열 컬렉션입니다. SADD 명령은 세트에 새 요소를 추가합니다. 주어진 요소가 이미 존재하는지 테스트, 여러 집합 간의 교차, 합집합 또는 차이 수행 등과 같은 집합에 대해 여러 가지 다른 작업을 수행 할 수도 있습니다.
> sadd myset 1 2 3
(integer) 3
> smembers myset
1. 3
2. 1
3. 2
여기에 세 가지 요소를 세트에 추가하고 Redis에게 모든 요소를 반환하도록 지시했습니다. 보시다시피 정렬되지 않았습니다 - Redis는 요소 순서에 대한 사용자와 계약이 없기 때문에 모든 호출에서 임의의 순서로 요소를 반환 할 수 있습니다. Redis에는 멤버십을 테스트하는 명령이 있습니다. 예를 들어 요소가 있는지 확인합니다.:
> sismember myset 3
(integer) 1
> sismember myset 30
(integer) 0
“3” is a member of the set, while “30” is not.
집합은 개체 간의 관계를 표현하는 데 유용합니다. 예를 들어 태그를 구현하기 위해 집합을 쉽게 사용할 수 있습니다..
이 문제를 모델링하는 간단한 방법은 태그를 지정하려는 모든 객체에 대한 집합을 갖는 것입니다. 집합에는 개체와 연결된 태그의 ID가 포함됩니다.
한 가지 예는 뉴스 기사에 태그를 지정하는 것입니다. 기사 ID 1000에 태그 1, 2, 5 및 77 태그가 지정된 경우 집합은 이러한 태그 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
Note: 예제에서는 태그 ID를 태그 이름에 매핑하는 Redis 해시와 같은 다른 데이터 구조가 있다고 가정합니다.. 올바른 Redis 명령을 사용하여 구현하기 쉬운 다른 사소한 작업이 있습니다. 예를 들어 태그 1, 2, 10 및 27을 함께 사용하는 모든 객체 목록을 원할 수 있습니다. 서로 다른 세트 간의 교차를 수행하는 SINTER 명령을 사용하여이 작업을 수행 할 수 있습니다. 우리는 사용할 수 있습니다:
> sinter tag:1:news tag:2:news tag:10:news tag:27:news
... results here ...
교차 외에도 합집합, 차이, 무작위 요소 추출 등을 수행할 수 있습니다.. 요소를 추출하는 명령을 SPOP라고 하며 특정 문제를 모델링하는 데 편리합니다. 예를 들어 웹 기반 포커 게임을 구현하려면 덱을 세트로 표현할 수 있습니다. (C) lubs, (D) iamonds, (H) earts, (S) pades에 대해 1 자 접두사를 사용한다고 상상해보십시오.:
> 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 명령은 임의의 요소를 제거하여 클라이언트로 반환하므로이 경우 완벽한 작업입니다.
그러나 덱에 대해 직접 호출하면 다음 게임 플레이에서 카드 덱을 다시 채워야 하므로 이상적이지 않을 수 있습니다.
먼저 덱 키에 저장된 세트의 복사본을 게임에 만들 수 있습니다 :
이 작업은 일반적으로 여러 집합 간의 합집합을 수행하고 결과를 다른 집합에 저장하는 SUNIONSTORE를 사용하여 수행됩니다.
그러나 단일 세트의 합집합 자체이기 때문에 내 데크를 복사할 수 있습니다.:
> sunionstore game:1:deck 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"
One pair of jacks, not great… 집합 내의 요소 수를 제공하는 set 명령을 소개하기에 좋은 시기입니다. 이것은 종종 집합 이론의 맥락에서 집합의 카디널리티라고 불리 므로 Redis 명령을 SCARD라고합니다..
> scard game:1:deck
(integer) 47
계산: 52 - 5 = 47. 세트에서 제거하지 않고 임의의 요소를 가져와야 하는 경우 작업에 적합한 SRANDMEMBER 명령이 있습니다. 또한 반복되는 요소와 반복되지 않는 요소를 모두 반환하는 기능이 있습니다..
댓글남기기