Redis 정렬 세트 설명

시작하기 전에, 우리는 해구 명칭을 통해 정렬 집합을 이해합시다.

위에서 말한 바와 같이 정렬 집합은 중복 구성원을 허용하지 않는 집합 데이터 구조이다.동시에 그 구성원은 오름차순으로 배열된다.양자의 결합을 통해 우리는 정렬집을 유일한 구성원의 질서정연한 집합으로 정의할 수 있다.
정렬 세트는 Redis의 컬렉션 데이터 구조와 유사합니다.구성원은 반복되지 않는 문자열의 목록일 수 있습니다.유일한 차이점은 모든 구성원이 하나의 점수와 연결되어 있다는 것이다. 이것은 부동점수로 정렬 집합에 정렬 순서를 제공한다.구성원은 항상 가장 작은 점수에서 가장 큰 점수로 정렬한다.

헬스 랭킹


정렬된 집합을 이해하는 가장 좋은 방법은 score와member열을 포함하는 표로 묘사하는 것이다.다음은 가상의 헬스 랭킹이다. 그 중에서 회원란은 선수를 대표하고 점수는 그들이 지금까지 걸어온 걸음걸이를 대표한다.

차트는 점수에 따라 오름차순으로 배열된다.점수는 복사할 수 있지만 구성원은 복사할 수 없습니다.
두 구성원의 점수가 같으면 Redis는 구성원의 사전 순서에 따라 정렬합니다.예를 들어 제니퍼와 피터의 점수는 690점으로 같다.하지만 리디스는 J가 P 앞에 있기 때문에 제니퍼를 Peter 앞에 놓을 것이다.
너도 오른쪽의 랭킹에 주의할 수 있다.순위는 각 멤버의 득점 크기에 따라 각 멤버에게 분배되는 은밀한 속성이다.이것은 0에서 시작하는 색인이다.가장 낮은 점수를 받은 멤버는 0급으로 배정된다.
정렬 집합에서 구성원을 검색할 때, 질은 매우 유용하다.

좋은 점과 용례


Redis는 정렬 세트가 항상 정렬되도록 보장합니다.저장된 구성원을 검색하는 클라이언트는 별도의 정렬을 필요로 하지 않습니다.이는 클라이언트의 CPU 주기를 절약하고 코드의 복잡성을 낮춘다.
정렬 세트를 사용하면 요소를 빠르게 추가, 삭제 또는 업데이트할 수 있습니다(시간은 요소 수의 대수에 비례함).요소는 순서대로 배열되는 것이지 순서대로 배열되는 것이 아니기 때문에 점수나 순위(위치)를 통해 범위를 빠르게 얻을 수 있습니다.정렬 집합의 중간 부분에 접근하는 것도 매우 빠르기 때문에 정렬 집합을 비중복 요소의 스마트 목록으로 사용해서 필요한 모든 내용을 신속하게 접근할 수 있다.
이것은 정렬을 실시간, 낮은 지연 순위, 우선순위 대기열, 2단계 인덱스를 실현하는 데 가장 좋은 선택으로 통합시켰다.
지금까지 우리는 정렬집의 기본 지식을 소개했다.우리가 그것들에 대해 실행할 수 있는 재미있는 조작들을 보여 주십시오.

조작하다


우리는 구성원을 추가, 삭제, 증가, 검색하기 위해 정렬 집합에 대해 작업을 수행할 수 있습니다.일반적으로 이러한 작업은 "Z"로 시작합니다.
위에서 논의한 헬스 랭킹 예시를 사용해서 이 조작들을 보여 드리겠습니다.Redis CLI 를 사용하여 작업을 수행합니다.여기에서 사용할 수 있는 모든 정렬 집합 조작을 소개하지 않을 테니 주의하십시오.반대로, 유사한 차트를 만들 때, 나는 중요한 동작을 훑어본다.작업의 전체 목록은 항상 정렬 집합 documentation 을 참고할 수 있습니다.

게임에 새 유저 및 절차 추가


새로운 유저가 가입할 때, 그/그녀는 랭킹에 추가되어 보수를 주어야 한다.
이 작업 ZADD 은 정렬된 집합에 원소를 추가합니다.다음은 명령의 형식입니다.
ZADD <key> <score> <member>
key는 정렬 집합의 이름이다.다음 명령은 790단계를 players에 추가했습니다.보답으로 집합에 추가된 원소수를 제시했는데, 이 예에서 1이다.
127.0.0.1:6379> ZADD players 790 Lester
(integer) 1
127.0.0.1:6379>
다음과 같이 요소와 분수를 원하는 만큼 추가할 수 있습니다.요소는 추가된 순서가 아니라 분수에 따라 저장됩니다.
127.0.0.1:6379> ZADD players 980 Mary 850 Alice
(integer) 2
127.0.0.1:6379>
새 유저를 추가하면 유저의 구조는 다음과 같습니다.

유저 스텝 증가/감소


유저가 일상적인 보행을 할 때, 그들의 보수는 랭킹에서 갱신되어야 한다.ZINCRBY 명령을 사용하여 주어진 구성원의 점수를 임의의 값으로 늘릴 수 있습니다.
ZINCRBY <key> <increment> <member>
다음 명령은 Tom의 걸음 수를 10 증가시킵니다.
127.0.0.1:6379> ZINCRBY players 10 Tom
"570"
마이너스를 사용하여 점수를 줄일 수 있다.다음 명령은 켄드라의 걸음 수를 5로 줄입니다.
127.0.0.1:6379> ZINCRBY players -5 Kendra
"395"

득점으로 상위 10명의 선수를 검색하다


현재 우리는 상위 10명의 유저만 검색하면 차트에 그들을 표시할 수 있다.ZREVRANGE 명령은 구성원의 역순 점수에 따라 한 그룹이 지정한 구성원만 되돌려주는 것을 가능하게 한다.
명령은 다음 형식을 사용합니다.
ZREVRANGE <key> <start> <stop> [WITHSCORES]
ZREVRANGE 역순으로 구성원에게 돌아가 점수가 높은 것부터 낮은 것까지 배열된다.startstop 파라미터를 사용하여 시작과 끝 순위 인덱스 위치를 지정해야 합니다.
상위 10명의 선수들의 활약에 따라 그들을 뽑자.
127.0.0.1:6379> ZREVRANGE players 0 9
1) "Mary"
2) "Alice"
3) "Lester"
4) "Frank"
5) "Peter"
6) "Jennifer"
7) "Barbara"
8) "Tom"
9) "Kendra"
10) "Dave"
또 하나의 추가 매개 변수가 있습니다. WITHSCORES 은 모든 구성원의 점수를 되돌려줍니다.
127.0.0.1:6379> ZREVRANGE players 0 9 WITHSCORES
1) "Mary"
2) "980"
3) "Alice"
4) "850"
5) "Lester"
6) "790"
7) "Frank"
8) "740"
9) "Peter"
10) "690"
11) "Jennifer"
12) "690"
13) "Barbara"
14) "650"
15) "Tom"
16) "570"
17) "Kendra"
18) "395"
19) "Dave"
20) "340"
ZRANGE 명령의 작용은 이와 상반된다.그것은 낮은 점수에서 높은 점수로 등급순으로 구성원에게 돌아간다.
다음 명령은 최소 걸음의 10위 유저를 되돌려줍니다.
127.0.0.1:6379> ZRANGE players 0 9
1) "Dave"
2) "Kendra"
3) "Tom"
4) "Barbara"
5) "Jennifer"
6) "Peter"
7) "Frank"
8) "Lester"
9) "Alice"
10) "Mary"

단일 유저의 레벨과 점수를 검색합니다


지금 우리는 유저에게 주어진 점수와 등급을 찾아야 한다.때때로 이것은 유저의 개인 자료에 나타날 수 있다.ZRANKZREVRANK 명령은 구성원의 순위로 돌아가는데 이것은 0 기반의 색인 위치이다.
명령 형식은 다음과 같습니다.
[ZRANK|ZREVRANK] <key> <member>
다음 명령은 현재 차트 하단에 있는 0으로 돌아가는 Dave입니다.
127.0.0.1:6379> ZRANK players Dave
(integer) 0
마찬가지로ZREVRANK Mary에 대해서는 0으로 돌아가야 합니다.점수가 낮은 순서에서 높은 순서로 되돌아오기 때문이다.
127.0.0.1:6379> ZREVRANK players Mary
(integer) 0
ZSCORE 구성원과 관련된 현재 점수를 제공합니다.명령 형식은 다음과 같습니다.
ZSCORE <key> <member>
이것은 피터의 점수인 690으로 되돌아갈 것이다.
127.0.0.1:6379> ZSCORE players Peter
"690"

점수에 따라 선수 수를 계산하다


우리는 어떻게 해야만 주어진 보폭 사이를 걷는 선수의 수를 찾을 수 있습니까?예를 들어 500보를 넘지만 700보도 안 되는 운동선수가 얼마나 됩니까?
이 명령ZCOUNT은 최소와 최대 점수 사이의 구성원 수를 통계할 것이다.이것은 포용적이다.명령 형식은 다음과 같습니다.
ZCOUNT <key> <min> <max>
다음 명령은 500 ~ 700보를 지나간 유저 수를 되돌려줍니다.
127.0.0.1:6379> ZCOUNT players 500 700
(integer) 4

유저를 게임에서 제거


유저가 게임을 떠날 때, 우리는 그들을 랭킹에서 제거해야 한다.ZREM 명령은 정렬 세트에서 하나 이상의 구성원을 제거합니다.명령 형식은 다음과 같습니다.
ZREM <key> <member> [<member> …]
우리는 바바라를 차트에서 제명할 수 있다. 왜냐하면 그녀는 시합에서 물러나기로 결정했기 때문이다. 왜냐하면 그녀는 너무 피곤하기 때문이다.
127.0.0.1:6379> ZREM players Barbara
(integer) 1
마지막으로 이 모든 조작 후에 우리의 차트는 이렇다.

결론


정렬 집합의 자연스러운 순서와 저장 요소에 접근하는 효율 때문에 정렬 집합은 실시간 랭킹 등 응용 프로그램을 구축할 때 점점 인기를 끌고 있다.이들은 보통 메모리에 100만 개 이상의 요소를 저장하고 실시간 대시보드에 대한 짧은 지연 액세스를 제공합니다.
전통적인 데이터베이스로 같은 기능을 실현하는 것은 항상 도전적이다.설령 네가 이 점을 성공적으로 해냈다 하더라도 그것을 계기판에 입력하는 것은 재난을 가져올 것이다.
이 때문에 리디스와 같은 메모리 데이터 구조가 이곳에서 인기를 끌고 있다.

도구책


https://redis.io/topics/data-types

좋은 웹페이지 즐겨찾기